Android Data Storage(数据存储)之SharedPreferences

来源:互联网 发布:中二网络意思 编辑:程序博客网 时间:2024/05/29 17:44

SharedPreferences类提供了一些大体框架,允许你保存和获取由基本数据类型组成的持久键值对。你能使用SharedPreferences保存一些基本数据:booleans, floats, ints, longs, and strings.这些数据将持久存在用户的会话(甚至你的应用程序被杀死)

对于SharedPreferences类的描述:

/**
 * Interface for accessing and modifying preference data returned by {@link
 * Context#getSharedPreferences}.  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 an {@link Editor} object
 * to ensure the preference values remain in a consistent state and control
 * when they are committed to storage.
 *
 * <p><em>Note: currently this class does not support use across multiple
 * processes.  This will be added later.</em>
 */

用于访问和修改Context.getSharedPreferences(String, int)返回的偏好设置数据的一个接口。对于任何一个特殊的
preferences,所有客户端共享这个此类单一的实例。修改preferences必须通过SharedPreferences.Editor 对象,以
确保当他们提交存储数据操作时,preferences值保持一致状态。

注意:目前,这个类不支持多线程访问,留待以后添加。


使用两种方法其中之一,可以获取你应用程序的SharedPreferences对象:
1、getSharedPreferences(String, int)  -- 使用此方法你需要多个preferences文件中指定文件名,也就是指定的第一个参数。
2、getPreferences()  -- 使用此方法如果在你的Activity中只需要一个preferences文件,因为这将是唯一的preferences文件在你的Activity中,你不需要提供名称。

获取SharedPreferences对象后,就是写入值:

1、 回调edit()获取一个SharedPreferences.Editor对象
2、 添加值方法比如:putBoolean()/putString()
3、 提交新值对象调用commit()方法

核心原理:

保存基于XML文件存储的Key-Value键值对数据,通常用来存储一些简单的配置信息。通过File Explorer,SharedPreferences数据总是存储在/data/data/<package name>/shared_prefs目录下

如下图:



SharedPreferences对象本身只能获取数据不支持存储和修改,存储修改是通过SharedPreferences.Edit对象实现的SharedPreferences本身是一个接口程序,无法直接创建SharedPreferences实例,只能通过提供的getSharedPreferences(String name, int mode)方法来获取SharedPreferences对象,该方法中name表示要操作的xml文件名,第二参数具体如下:

Context.MODE_PRIVATE:指定该SharedPreferences数据只能被本应用程序读、写。
Context.MODE_WORLD_READABLE:指定该SharedPreferences数据能被其他应用程序读,但不能写。
Context.MODE_WORLD_WRITEABLE:指定该SharedPreferences数据能被其他应用程序读、写。

Editor主要方法:
SharedPreferences.Editor clear(): 清空SharePreferences所有数据
SharedPreferences.Editor putXxx(String key,String value): 向SharedPreferences存入指定key对应的数据,其中Xxx为基本数据类型:boolean,int,float等或String,StringSet
SharedPreferences.Editor remove(String key): 删除SharedPreferences指定key对应的数据项
boolean commit(): 当Editor编辑完成后,提交修改。

// 记录存储数据类                                                                                                              public class RmsDataBase {    private String dbname_;    private Activity app_;    private SharedPreferences store_;        public RmsDataBase(Activity app, String dbName) {        this.dbname_ = dbName;        this.app_ = app;        this.store_ = app_.getSharedPreferences(dbname_, Context.MODE_PRIVATE);//        this.store_ = app_.getSharedPreferences(dbname_, Context.MODE_WORLD_READABLE);    // 其他程序可以访问读取    }        public String getDBName(){        return dbname_;    }        /**     * 移除数据表     */    public void deteleDB(){        store_.edit().remove(dbname_);    }        /**     * 获取数据     * @param key     * @return     */    public String get(String key) {        String value = null;                 try {            value = store_.getString(key, "");        } catch (Exception e) {            e.printStackTrace();        } finally {}        return value;    }        /**     * 存储键值对     * @param key     * @param value     */    public void save(String key, String value) {        try {            SharedPreferences.Editor editor = store_.edit();            editor.putString(key, value);            editor.commit();        } catch (Exception e) {            e.printStackTrace();        } finally {}    }        /**     * 删除键值对     * @param key     */    public void delete(String key) {        try {            SharedPreferences.Editor editor = store_.edit();            editor.remove(key);            editor.commit();        } catch (Exception e) {            e.printStackTrace();        } finally {}    }} 

                                                                                                            
// 对数据进行处理测试public class MainActivity extends Activity {    LinearLayout ll_;    RmsDataBase rmsDB;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.layout_sharedpreferences);                ll_ = (LinearLayout) findViewById(R.id.ll_content);                findViewById(R.id.button1).setOnClickListener(new OnClickListener() {                        @Override            public void onClick(View v) {                addData();            }        });                findViewById(R.id.button2).setOnClickListener(new OnClickListener() {                        @Override            public void onClick(View v) {                getData();            }        });                        rmsDB = new RmsDataBase(this, getLocalClassName());         // 调用其他应用程序的SharedPreferences文件         /*try {                   Context context = createPackageContext("访问应用程序包名", CONTEXT_IGNORE_SECURITY);            SharedPreferences sp = context.getSharedPreferences("访问应用程序的文件名", Context.MODE_WORLD_READABLE);            // ...其他都一样        } catch (NameNotFoundException e) {            e.printStackTrace();        }*/    }        public void addData(){        System.out.println("------ >>>> " + rmsDB.getDBName());        rmsDB.save("name", "john");        rmsDB.save("age", "18");    }        public void getData(){        String name = rmsDB.get("name");        String age = rmsDB.get("age");                System.out.println("------ >>>> " + name);        System.out.println("------ >>>> " + age);            }}  

读写其他应用程序的SharedPreferences:
1、在创建SharedPreferences时、指定
MODE_WORLD_READABLE或MODE_WORLD_WRITEABLE,表明可读取,写入
this.store_ = app_.getSharedPreferences(dbname_, Context.MODE_WORLD_READABLE);    // 其他程序可以访问读取
2、创建其他程序对应的Context:
Context context = createPackageContext("访问应用程序包名", Context.CONTEXT_IGNORE_SECURITY);
3、使用访问程序的Context获取SharedPreferences对象
SharedPreferences sp = context.getSharedPreferences("访问应用程序的文件名", 1);
4、 其他操作同操作自己应用程序SharedPreferences一样


0 0