Android数据持久化之Preferences机制详解
本文实例讲述了android数据持久化之preferences机制。分享给大家供大家参考,具体如下:
在android中,实现数据持久化有五种方式:preferences,文件file,i/o操作、sqlite数据库,contentprovider组件。
下面逐个做一简单的介绍:
一、preferences的介绍:
preferences是一种轻量级的数据存储机制,他将一些简单的数据类型的数据,包括boolean类型,int类型,float类型,long类型以及string类型的数据,以键值对的形式存储在应用程序的私有preferences目录(/data/data/<包名>/shared_prefs/)中,这种preferences机制广泛应用于存储应用程序中的配置信息。
如下是preferences的一个简单代码:
这个代码是创建不同权限的数据对象:
package com.example.data_sharedpreferences; import android.os.bundle; import android.app.activity; import android.content.context; import android.content.sharedpreferences; import android.view.menu; import android.view.view; import android.view.view.onclicklistener; import android.widget.button; import android.widget.textview; public class mainactivity extends activity { private textview text; private button button; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); // 写入数据 writedata(); text = (textview) findviewbyid(r.id.text); button = (button) findviewbyid(r.id.button0); button.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { // todo auto-generated method stub // 读取数据 readdata(); } }); } /** * 写入数据 */ public void writedata() { // 设置权限为私有mode_private sharedpreferences sp_p = this.getsharedpreferences("ct_sp_private", context.mode_private); // 通过sharedpreferences对象的编辑器对象editor来实现存入数据 sharedpreferences.editor editor = sp_p.edit(); // 通过该编辑器函数设置键值 editor.putstring("username", "marry_private"); // 提交数据,并将数据写入xml文件中 editor.commit(); // 设置为只读 sharedpreferences sp_or = this.getsharedpreferences("ct_sp_private", context.mode_world_readable); sp_or.edit().putstring("username", "marry_only_read").commit(); // 设置为只写 sharedpreferences sp_ow = this.getsharedpreferences("ct_sp_private", context.mode_world_writeable); sp_ow.edit().putstring("username", "marry_only_write").commit(); // 设置为可读可写 sharedpreferences sp_x = this.getsharedpreferences("ct_sp_private", context.mode_world_readable + context.mode_world_writeable); sp_x.edit().putstring("username", "marry_write_read").commit(); } /** * 读取数据 * 通过sharedpreferences对象的键key可以获取到对应key的键值value。对于不同类型的键值有不同的函数:getboolean * ,getint,getfloat,getlong. */ public void readdata() { // todo auto-generated method stub text.settext("private_username:" + this.getsharedpreferences("ct_cp_private", 0).getstring( "username", "marry_private") + "\r\n" + "read_username:" + this.getsharedpreferences("ct_cp_private", 0).getstring( "username", "marry_only_read") + "\r\n" + "write_username:" + this.getsharedpreferences("ct_cp_private", 0).getstring( "username", "marry_only_write") + "\r\n" + "write_read_username:" + this.getsharedpreferences("ct_cp_private", 0).getstring( "username", "marry_write_read") + "\r\n"); } @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; } }
下面这个代码则是实现在另外一个应用中访问上一个应用,并读取上面应用的数据:
package com.example.data_sharedpreferences2; import com.example.data_sharedpreferences2.r; import android.os.bundle; import android.app.activity; import android.content.context; import android.content.pm.packagemanager.namenotfoundexception; import android.view.menu; import android.view.view; import android.view.view.onclicklistener; import android.widget.button; import android.widget.textview; /** * 该程序的功能是访问data_sharedpreferences应用 sharedpreferences访问另一个应用的条件: * 1、被访问的应用权限为可读或者可写 2、必须要知道被访问应用的包名 * * @author marry * */ public class mainactivity extends activity { private textview text; private button button; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); text = (textview) findviewbyid(r.id.text); button = (button) findviewbyid(r.id.button0); button.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { // 访问应用1,并读取应用1的数据 try { // 获得要访问应用的context context orthercontext = createpackagecontext( "com.example.data_sharedpreferences", 0); // 通过orthercontext.getsharedpreferences打开应用1的文件 text.settext("private_username:" + orthercontext.getsharedpreferences( "ct_cp_private", 0).getstring("username", "marry_private") + "\r\n" + "read_username:" + orthercontext.getsharedpreferences( "ct_cp_private", 0).getstring("username", "marry_only_read") + "\r\n" + "write_username:" + orthercontext.getsharedpreferences( "ct_cp_private", 0).getstring("username", "marry_only_write") + "\r\n" + "write_read_username:" + orthercontext.getsharedpreferences( "ct_cp_private", 0).getstring("username", "marry_write_read") + "\r\n"); } catch (namenotfoundexception e) { // todo auto-generated catch block e.printstacktrace(); } } }); } @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; } }
使用preferences时有以下需要注意的地方:
1、 通过context.getsharedpreferences(string filename,int mode)
方法,可以打开一个xml文件,文件的位置在/data/data/package_name/shared_prefs/filename.xml,如果不存在,则会自动创建。可以对该文件进行读写操作,在应用内的各组件之间共享数据。如果将mode设置为context.mode_world_read或者context.mode_world_write,则还可以被其他应用访问到。不过这不是android推荐的方式,要实现跨应用共享数据,推荐的方式是用contentprovider实现
2、 如果要访问另一个应用创建的shared_prefs文件,需要满足2个条件,首先另一个应用要设置mode_world_read或mode_world_wirte权限,并且要知道另一个应用的package_name,然后就可以通过context.createpackagecontext()
方法,就可以得到另一个应用的context,然后context.getsharedpreferences()
方法,就可以打开shared_prefs文件了。不过这种方法并不推荐
3、 在罕见的情况下,如果既把shared_prefs的权限设置为mode_private,又希望某些其他的应用可以访问到,那么可以在manifest文件中配置android:user_id(好像是这个属性),让多个应用共享user_id。因为本质上shared_prefs文件是采用linux的权限控制的,mode_private类似于-rw-------,所以如果多个应用使用了同一个user_id,自然都对这个文件有访问权限了
更多关于android相关内容感兴趣的读者可查看本站专题:《android数据库操作技巧总结》、《android编程之activity操作技巧总结》、《android文件操作技巧汇总》、《android编程开发之sd卡操作方法汇总》、《android开发入门与进阶教程》、《android资源操作技巧汇总》、《android视图view技巧总结》及《android控件用法总结》
希望本文所述对大家android程序设计有所帮助。
上一篇: javascript 表单规则集合对象
下一篇: Python可迭代对象操作示例