zoukankan      html  css  js  c++  java
  • 在android中使用SharedPreferences进行数据存储

    Android提供的SharedPreferences类似于Windows程序中常用的ini文件,以Key-Value的形式来保存应用程序的属性设置信息(区分数据类型)。比如,可以用来保存用户上一次的登录信息;可以保存媒体播放程序的音量设置以及上次播放位置等。

    在使用SharedPreferences时常用的方法包括(方法具体含义参考官方文档):

    1. Context.getSharedPreferences (String name, int mode)

    2. Activity.getPreferences (int mode)

    3. SharedPreferences.edit();

    4. SharedPreferences.getXXX(name, defaultValue);

    5. SharedPreferences.Editor.putXXX(name, value);
    6. SharedPreferences.Editor.commit();

    步骤:

    保存数据

    复制代码
    Log.d("SharedPreferences", "保存数据...");
    //获得SharedPreferences对象
    SharedPreferences settings = this.getSharedPreferences("shared_file", 0);
    //获得可编辑对象
    SharedPreferences.Editor editor = settings.edit();
    editor.putString("name", "Kael Chen");
    editor.putInt("age", 22);
    editor.commit();
    Log.d("SharedPreferences", "保存数据成功");
    复制代码

    读取数据

    复制代码
    Log.d("SharedPreferences", "获取数据...");
    SharedPreferences settings = this.getSharedPreferences("shared_file", 0);
    String name = settings.getString("name", "no name");
    int age = settings.getInt("age", 0);
    Log.d("SharedPreferences", "name:" + name + ", age:" + age);
    Log.d("SharedPreferences", "获取数据成功");
    复制代码

    执行代码后,可以看到在data/data/pacakge name/shared_prefs/目录下多了一个shared_file.xml文件,文件名是由getSharedPreferences方法中传入的参数决定的。

    文件内容如下:

    <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
    <map>
    <string name="name">Kael Chen</string>
    <int name="age" value="22" />
    </map>

    可以看到,不同于ini文件的是,这里是严格区分了数据的类型的,所以在getXXX和putXXX相同数据时使用的类型一定要匹配。


    另外值得注意的是getSharedPreferences 方法中的mode参数以及getPreferences和getSharedPreferences 的区别。

    getPreferences和getSharedPreferences的区别:

    1、getPreferences只能由Activity调用,只在调用它的Activity范围内有效。

    2、getSharedPreferences是由Context调用,在包范围内有效。可以这样理解,AndroidManifest.xml文件中定义了包的位置,比如我的测试程序中定义的包为cn.kael.sample,那么android会建立data/data/cn.kael.sample/shared_prefs/的目录,并在其下产生SharePreferences文件。因此如果已经在一个地方使用了SharedPrefernces,并创建了相应的SharedPrefernces文件,然后你想在另一个地方使用该SharedPrefernces文件,你只需要根据文件的路径规则判断在新的地方使用SharedPrefernces生成的路径是不是和之前SharedPrefernces文件的路径一致,就可以知道两者之间是否能够共用SharedPrefernces,即使它们不属于同一个应用程序(因为android是根据包名来决定SharedPrefernces文件的创建位置的,和应用程序名无关)。

    关于mode参数:

    要想在程序B想访问程序A的SharedPrefernces文件:

    首先需要程序A在创建SharedPrefernces时使用MODE_WORLD_WRITEABLE或者MODE_WORLD_READABLE作为mode参数:

    SharedPreferences settings = this.getSharedPreferences("shared_file", Context.MODE_WORLD_WRITEABLE);

    然后在程序B中需要先创建程序A的context对象,然后再通过这个context对象来调用getSharedPreferences方法:

    Context contextA = createPackageContext("cn.kael.sample",
    Context.CONTEXT_IGNORE_SECURITY);
    SharedPreferences settings = contextA.getSharedPreferences(
    "shared_file", Context.MODE_WORLD_WRITEABLE);

    但是然我不明白的是无论这个mode是设置为MODE_WORLD_WRITEABLE还是MODE_WORLD_READABLE,在程序B中都可以对程序A的SharedPrefernces文件进行读写,并且读写后SharedPrefernces文件发生的改变也只在程序B中有效。而且Logcat中会出现下面一个error信息:

    11-30 16:52:00.965: ERROR/ApplicationContext(25124): Couldn't rename file /data/data/cn.kael.sample/shared_prefs/shared_file.xml to backup file /data/data/cn.kael.sample/shared_prefs/shared_file.xml.bak

    知道原因的请告诉我,谢谢!!!

  • 相关阅读:
    JS收集<3>:限制URL
    TSQL小收集<1>:为已经存在的表添加唯一约束
    第一个NHibernate实例 yangan
    用Javascript获取select的值 yangan
    获取页面名称语句 yangan
    asp.net中当服务器出错时显示指定的错误页面,同时把错误信息写入系统日志文件 yangan
    Log4Net使用指南 yangan
    明确自己的首要责任
    《大数据时代》摘录
    2013年3月阅读链接
  • 原文地址:https://www.cnblogs.com/Gaojiecai/p/2485556.html
Copyright © 2011-2022 走看看