你的位置:首页 > 操作系统

[操作系统]Android数据保存之SharedPreference

前言:

程序中处理的大部分问题都与数据有关,读取数据显示在UI上,读取的数据可以是本地的,也可以是网络的。保存用户数据到存储空间,可以是本地的数据库,文件等,也可以是保存到网络服务器。总之大部分的程序都是在和数据打交道。Android中数据保存比较方便灵活,今天就按照官网说说数据保存。

大多数Android应用程序都需要存储数据,在Android生命周期方法onPause中,你可以保存用户在程序中的进度数据,在用户再次进入程序时进行读取恢复。可能一些应用程序不需要保存用户的进度信息,但是用户对于应用程序的设置信息一定要保存。很多应用需要保存大量的数据到数据库或者文件里,比如看电视的应用,需要保存大量的频道信息。下面就给大家介绍一下在Android中数据是如何保存的。

 

key-value键值集合保存数据:

如果你有一些相对较少的键值数据集需要保存,那么SharedPreferences应该能够满足你。一个SharedPreferences对象指向了一个键值对形式保存数据的Shared Preference文件,它提供了一些很方便读取和写入数据的方法。每一个SharedPreferences文件都被Android framework管理,可以是只能创建它的应用程序访问,也可以分享给其他应用程序。怎么用SharedPreferences·保存数据呢?

 

获取SharedPreferences对象:

你可以创建一个新的Shared Preference 共享文件,如果已经存在则直接返回指向该共享文件的SharedPreferences该对象,有两种方法可以完成这个工作:

  • getSharedPreferences(String name, int mode)
    此方通通过Context对象调用,返回一个唯一的SharedPreferences对象,这里的唯一指的是通过name来查找的唯一对应的SharedPreferences,如果没有查找到则会用name来创建一个。唯一的好处就是你在一个地方保存后在另外的地方立刻就能读取到这个值。用mode来区分创建的SharedPreferences对象共享类型,MODE_PRIVATE表示该应用程序私有,MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE是表示全局读或写权限,MODE_MULTI_PROCESS表示可以跨进程访问。
  • getPreferences(int mode)
    此方法被Activity对象调用,会创建一个只能被该Activity访问的SharedPreferences对象,该方法是封装的上面的那个方法,默认创建的SharedPreferences名字是该Activity的名字,所以不用传此参数,mode只有MODE_PRIVATE、MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE三个可选,缺少MODE_MULTI_PROCESS,因为只有该Activity有权限访问,所以跨进程没什么用。
举个例子:
Context context = getActivity();SharedPreferences sharedPref = context.getSharedPreferences(    getString(R.string.preference_file_key),Context.MODE_PRIVATE);

  

上面的代码是在一个Fragment中调用的,getActivity()是获取Fragment所在的Activity对象(Activity是继承自Context),R.string.preference_file_key是该SharedPreferences的名字,mode是Context.MODE_PRIVATE私有类型。
 
注意:当你给SharedPreferences起名字的时候最好是复杂点的,这样就能保证不会有名字重复却属于不同应用程序的SharedPreferences,最好是以你的应用包名再加上其他构成,比如"com.example.myapp.PREFERENCE_FILE_KEY"。
 
获取一个Activity的SharedPreferences代码如下:
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);

上面是创建了一个Activity私有的SharedPreferences对象。
 
注意:当你创建SharedPreferences时mode值的是MODE_WORLD_PRIVATE或者MODE_WORLD_WRITEABLE,你创建的Shared Preferences文件是可以被其他应用程序访问的。这两种mode都是比较危险的,因为其他应用程序也能访问,所以会造成数据外泄。google给出的建议是尽量不要用这种机制来进行数据共享传递,可以用其他方法来代替这种机制,比如使用ContentProvider,BroadcastReceiver或者Service。
 

写入数据到Shared Preferences文件:

写入数据到Shared Preferences是通过获取SharedPreferences.Editor对象,调用该对象的一些putXX(key,value)方法来写入key对应的值,然后调用commit()方法提交写入完成的,代码如下:


 
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);SharedPreferences.Editor editor = sharedPref.edit();editor.putInt(getString(R.string.saved_high_score), newHighScore);editor.commit();

  


SharedPreferences.Editor对象的putXX(String key,数据类型)方法可以保存boolean、int、float、long、String和Set<String>类型的数据,但是put方法只是建立好键值对的数据联系,并没有保存,直到你调用commit()或者apply()方法。调用remove(String key)可以清除key对应的数据(还需要调用commit方法提交操作),你也可以调用clear()方法把所有数据清除掉。
 
注意:commit()和apply()都是提交对数据的操作,但是它们还是有些区别的:
1、commit方法有返回值,返回值是一个boolean变量,表示你的保存动作是否成功,apply是没有返回值的,所以如果你不需要返回值,也不关心提交是否成功可以用apply来代替commit;
2、apply是先把数据更改提交到内存,然后再异步保存到磁盘上,而commit这两个操作是同步的,所以在进行频繁提交数据更改时apply更为高效;
 

读取数据从Shared Preferences文件:

 
从Shared Preferences文件读取之前保存的数据比较简单,通过SharedPreferences对象的getXX方法就能完成,代码如下:
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);int defaultValue = getResources().getInteger(R.string.saved_high_score_default);long highScore = sharedPref.getInt(getString(R.string.saved_high_score), defaultValue);

  


SharedPreferences的getXX(String key, defValue)方法key就是之前调用SharedPreferences.Editor的put(String key,数据类型)方法时的key,defValue是在找不到对应的key的数据时返回的默认数据。
 

总结:

保存数据分四步:
1、获取SharedPreferences对象;
2、获取SharedPreferences.Editor对象;
3、调用put方法添加数据;
4、调用commit保存数据;
获取数据很简单,分两步:
1、获取SharedPreferences对象;
2、调用get方法获取key对应的值;
 

以上就是利用SharedPreferences进行数据保存的知识,基本上包含了所有使用SharedPreferences的方法和注意事项,有哪些地方写的不好还请大神们批评指正。

本文属原创,转载请注明出处,违者必究

关注微信公众平台:程序员互动联盟(coder_online),你可以第一时间获取原创技术文章,和(java/C/C++/Android/Windows/Linux)技术大牛做朋友,在线交流编程经验,获取编程基础知识,解决编程问题。程序员互动联盟,开发人员自己的家。

Android binder学习一:主要概念