加载中…
个人资料
一叶知秋
一叶知秋
  • 博客等级:
  • 博客积分:0
  • 博客访问:424,864
  • 关注人气:82
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

Android数据存储之SharedPreferens

(2013-06-06 19:48:53)
标签:

it

分类: android开发

    很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的QQ,用户可以设置是否允许陌生人添加自己为好友。对于软件配置参数的保存,如果是window软件通常我们会采用ini文件进行保存,如果是j2se应用,我们会采用properties属性文件进行保存。对于Android应用,Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。使用SharedPreferences保存数据,其背后是用xml文件存放数据,用键值对的方式把简单数据类型(booleanintfloatlongString)存储在应用程序的私有目录下(data/data/包名/shared_prefs/)自己定义的xml文件中。所以通常用来存储一些简单的配置信息。其存储位置在/data/data/<</SPAN>包名>/shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。实现SharedPreferences存储的步骤如下:

 

一、根据Context获取SharedPreferences对象

SharedPreferences sp this.getSharedPreferences("SP",  MODE_PRIVATE); 

    方法的第一个参数用于指定该文件的名称,名称不用带后缀,会由Android自动加上。

    方法的第二个参数指定文件的操作模式,共有四种操作模式,

MODE_PRIVATE=0:只能当前的应用才能操作文件,如果文件已经存在新内容覆盖原内容;

MODE_APPEND=32768:只能当前的应用才能操作文件新内容追加到原内容后;

MODE_WORLD_READABLE=1:允许其他应用程序读取本应用创建的文件;

MODE_WORLD_WRITEABLE=2:允许其他应用程序写入本应用程序创建的文件,会覆盖原数据。

如果希望SharedPreferences背后使用的xml文件能被其他应用读和写,可以指定

    Context.MODE_WORLD_READABLEContext.MODE_WORLD_WRITEABLE权限。
   
另外Activity还提供了另一个getPreferences(mode)方法操作SharedPreferences,这个方
法默认使用当前类不带包名的类名作为文件的名称。

 

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

Editor editor = sp.edit();

 

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

editor.putString("name", "string");
      editor.putInt("age", 0);
      editor.putBoolean("BOOLEAN_KEY", true);

 

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

editor.commit();


代码执行后,会在程序的/data/data/包名/shared_prefs目录下生成了一个SP.xml文件,

   一个应用可以创建多个这样的xml文件。

 

五、获取本程序中preference的数据

String name = sp.getString("name", "");
int age = sp.getInt("age", 1);

 getString()第二个参数为缺省值,如果preference中不存在该key,将返回缺省值


 

六、访问其他应用中的Preference

前提条件是:要访问的preference创建时指定了Context.MODE_WORLD_READABLE或者

Context.MODE_WORLD_WRITEABLE权限。

如:有个cn.itcast.action的应用使用下面语句创建了preference
getSharedPreferences("itcast", Context.MODE_WORLD_READABLE);

其他应用要访问上面应用的preference,首先需要创建上面应用的Context

Context c = createPackageContext("cn.itcast.action",

Context.CONTEXT_IGNORE_SECURITY);

参数一为需要获取Context的程序包名,

第二个参数为flags 标志位,有两个选项。

CONTEXT_INCLUDE_CODE的意思是包括代码,也就是说可以执行这个包里面的代码。

CONTEXT_IGNORE_SECURITY的意思是忽略安全警告,如果不加这个标志有些功能是用不了,会出现安全警告。

SharedPreferences sp = c.getSharedPreferences

("itcast", Context.MODE_WORLD_READABLE);

String name = sharedPreferences.getString("name", "");

int age = sharedPreferences.getInt("age", 0);

如果不通过创建Context访问其他应用的preference,可以以读取xml文件方式直接访问其他应用preference对应的xml文件,如:

//应替换成应用的包名。
File xmlFile = new File(
/data/data//shared_prefs/itcast.xml);

 

总结:

    SharedPreferences对象与SQLite数据库相比,免去了创建数据库,创建表,写SQL语句等诸多操作,相对而言更加方便,简洁。但是SharedPreferences也有其自身缺陷,比如只能存储booleanintfloatlongString五种简单的数据类型,比如无法进行条件查询等。所以不论SharedPreferences的数据存储操作是如何简单,它也只能是存储方式的一种补充,而无法完全替代如SQLite数据库这样的其他数据存储方式。

 

补充:(Android中得到SharedPreference的四种方式)

前面我们介绍了如何创建sharedPreferences对象,以及获取自己创建或者其他程序的preference中的数据,这只是其中的一种方式。在android系统中有四种得到SharedPreferences

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

这是我们上文中介绍的方式,通过这种方式,我们可以自己设置SharedPreferences的名字和模式 

     2,Activity.getPreferences(int mode)

    通过Activity对象获取,获取的是本Activity私有的Preference,保存在系统中的xml形式的文件的名称为这个

    Activity的名字,因此一个Activity只能有一个,属于这个Activity这种方式下,name是通过

       getLocalClassName()得到的,不能让我们自己设置,而且最终会调到 

ContextWrappergetSharedPreferences()

3,PreferenceManager.getSharedPreferences()

    因为Activity继承了ContextWrapper,因此也是通过Activity对象获取,但是属于整个应用程序,可以有多个,以第一参数的name为文件名保存在系统中。这种方式我们是让PreferenceManager给我们维护一个SharedPreference,当然我们可以调用PreferenceManagerAPI来设置namemode,并且最终也是调用到ContextWrappergetSharedPreferences

     4,PreferenceManager.getDefaultSharedPreferences(Context context)

PreferenceManager的静态函数,保存PreferenceActivity中的设置,属于整个应用程序,但是只有一个,Android会根据包名和PreferenceActivity的布局文件来起一个名字保存。这种方式得到的SharedPreference是某个包名下共享的,并且是私有的,不能让其他的包访问,而且Namemode不能设置。最终也会调用到ContextWrappergetSharedPreferences

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有