Android Data Storage(数据存储)之SharedPreferences

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一样


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值