[Android] SharedPreferences(轻量级的存储方式)

原来做项目都是自己编写存储,自己写软件的设置存储类,然后存储到文件中。
需要时通过反向进行读取。
用惯了后 也是挺方便的,但是总是感觉很累赘,在自己项目中需要写太多无用的东西。有时甚至需要考虑是否有文件夹,是否创建文件夹/文件。
最近搜索了一下,发现Android为我们提供的四种简单存储方式中的SharedPreferences。
这是一种轻量级的存储方式 ,适合用于软件的设置。

Google API“

Interface for accessing and modifying preference data returned by getSharedPreferences(String, int). For any particular set of preferences, there is a single instance of this class that all clients share. Modifications to the preferences must go through anSharedPreferences.Editor object to ensure the preference values remain in a consistent state and control when they are committed to storage. Objects that are returned from the various get methods must be treated as immutable by the application.

Note: currently this class does not support use across multiple processes. This will be added later.

Developer Guides

For more information about using SharedPreferences, read the Data Storage developer guide.

See Also
  • getSharedPreferences(String, int)
其实都是阐述,重要是获取需要使用: getSharedPreferences(String, int)

详细可以看:http://developer.android.com/reference/android/content/SharedPreferences.html

总结如下:

本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。

其存储位置在/data/data/<包名>/shared_prefs目录下。

SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。

实现步骤如下:

  一、根据Context获取SharedPreferences对象

  二、利用edit()方法获取Editor对象。

  三、通过Editor对象存储key-value键值对数据。

  四、通过commit()方法提交数据。

来一个实例;

package com.qiujuer.settingtest;

import android.content.Context;
import android.content.SharedPreferences;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;

public class MainActivity extends ActionBarActivity {
    private  final String TAG = "MainActivity-TAG";
    /**
     * 存储类,用于进行模拟设置存储
     * 包含3个变量,文件名,String模拟,int模拟
     */
    public static class SettingValue{
        public static final String PREF = "setting-pref";
        public static final String STRINGTEXT = "setting-stringtext";
        public static final String INTTEXT = "setting-inttext";
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
        }


        // 获取SharedPreferences对象
        // Context.MODE_PRIVATE:为默认操作模式
        // 代表该文件是私有数据,只能被应用本身访问,
        // 在该模式下,写入的内容会覆盖原文件的内容,
        // 如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
        SharedPreferences pref = this.getSharedPreferences(SettingValue.PREF,Context.MODE_PRIVATE);

        // 进行写入操作,这里使用第一种格式进行写入
        pref.edit().putString(SettingValue.STRINGTEXT,"这是String测试数据!").commit();
        pref.edit().putInt(SettingValue.INTTEXT,100).commit();

        //输出到日志,getString第二参数为默认值
        Log.i(TAG,pref.getString(SettingValue.STRINGTEXT,""));
        Log.i(TAG,String.valueOf(pref.getInt(SettingValue.INTTEXT,0)));

        //修改,这里采用第二种方式修改,适用于改动项多的情况
        SharedPreferences.Editor prefEdit = pref.edit();
        prefEdit.putInt(SettingValue.INTTEXT,80);
        prefEdit.commit();

        //输出到日志
        Log.i(TAG,pref.getString(SettingValue.STRINGTEXT,""));
        Log.i(TAG,String.valueOf(pref.getInt(SettingValue.INTTEXT,0)));
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        switch (item.getItemId()) {
            case R.id.action_settings:
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
            return rootView;
        }
    }

}

输出结果为:

11-11 12:17:25.105    1823-1823/com.qiujuer.settingtest I/MainActivity-TAG﹕ 这是String测试数据!
11-11 12:17:25.105    1823-1823/com.qiujuer.settingtest I/MainActivity-TAG﹕ 100
11-11 12:17:25.125    1823-1823/com.qiujuer.settingtest I/MainActivity-TAG﹕ 这是String测试数据!
11-11 12:17:25.125    1823-1823/com.qiujuer.settingtest I/MainActivity-TAG﹕ 80


你可能感兴趣的:(android,存储,设置)