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的一个简单代码:
这个代码是创建不同权限的数据对象:
packagecom.example.data_sharedpreferences; importandroid.os.Bundle; importandroid.app.Activity; importandroid.content.Context; importandroid.content.SharedPreferences; importandroid.view.Menu; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; importandroid.widget.TextView; publicclassMainActivityextendsActivity{ privateTextViewtext; privateButtonbutton; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //写入数据 writeData(); text=(TextView)findViewById(R.id.text); button=(Button)findViewById(R.id.button0); button.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ //TODOAuto-generatedmethodstub //读取数据 readData(); } }); } /** *写入数据 */ publicvoidwriteData(){ //设置权限为私有MODE_PRIVATE SharedPreferencessp_p=this.getSharedPreferences("ct_sp_private", Context.MODE_PRIVATE); //通过SharedPreferences对象的编辑器对象Editor来实现存入数据 SharedPreferences.Editoreditor=sp_p.edit(); //通过该编辑器函数设置键值 editor.putString("username","marry_private"); //提交数据,并将数据写入xml文件中 editor.commit(); //设置为只读 SharedPreferencessp_or=this.getSharedPreferences("ct_sp_private", Context.MODE_WORLD_READABLE); sp_or.edit().putString("username","marry_only_read").commit(); //设置为只写 SharedPreferencessp_ow=this.getSharedPreferences("ct_sp_private", Context.MODE_WORLD_WRITEABLE); sp_ow.edit().putString("username","marry_only_write").commit(); //设置为可读可写 SharedPreferencessp_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. */ publicvoidreadData(){ //TODOAuto-generatedmethodstub 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 publicbooleanonCreateOptionsMenu(Menumenu){ //Inflatethemenu;thisaddsitemstotheactionbarifitispresent. getMenuInflater().inflate(R.menu.main,menu); returntrue; } }
下面这个代码则是实现在另外一个应用中访问上一个应用,并读取上面应用的数据:
packagecom.example.data_sharedpreferences2; importcom.example.data_sharedpreferences2.R; importandroid.os.Bundle; importandroid.app.Activity; importandroid.content.Context; importandroid.content.pm.PackageManager.NameNotFoundException; importandroid.view.Menu; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; importandroid.widget.TextView; /** *该程序的功能是访问data_sharedpreferences应用Sharedpreferences访问另一个应用的条件: *1、被访问的应用权限为可读或者可写2、必须要知道被访问应用的包名 * *@authormarry * */ publicclassMainActivityextendsActivity{ privateTextViewtext; privateButtonbutton; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text=(TextView)findViewById(R.id.text); button=(Button)findViewById(R.id.button0); button.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ //访问应用1,并读取应用1的数据 try{ //获得要访问应用的context ContextortherContext=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(NameNotFoundExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } }); } @Override publicbooleanonCreateOptionsMenu(Menumenu){ //Inflatethemenu;thisaddsitemstotheactionbarifitispresent. getMenuInflater().inflate(R.menu.main,menu); returntrue; } }
使用Preferences时有以下需要注意的地方:
1、通过Context.getSharedPreferences(StringfileName,intmode)方法,可以打开一个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程序设计有所帮助。