Android——数据存储(二)(SharedPreferences存储)
SharedPreferences存储
SharedPreferences是使用键值对的方式来存储数据的。当保存一条数据时,需要给这条数据提供一个对应的键,这样在读取数据的时候就可以通过这个键把相应的值取出来。而且SharedPreferences还支持多种不同的数据类型存储,存储的数据是什么类型,读取出来也是什么类型。保存的数据是用XML格式进行管理的。SharedPreferences文件都是存放在/data/data/<package name>/shared_prefs/目录下的;
而且一个SharedPreferences对象只有一个实例返回给同名的调用者,这意味着它们将在编辑完成后立即看到彼此的编辑。
使用SharedPreferences要先获取它的实例,Android中主要提供了3中方法用于得到SharedPreferences对象。
- Context类中的getSharedPreferences(String name,int mode)方法:这个方法有两个参数,第一个参数用于指定要储存数据的SharedPreferences文件名;第二个参数用于指定操作模式,现在可以的只有填0或者MODE_PRIVATE,他们的效果是一样的,表示只有当前的应用程序才可以对这个SharedPreferences文件进行读写,还有三个模式已经不推荐使用了,分别是MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE和MODE_MULTI_PROCESS。
- Activity类中的getPreference(int mode)方法:这个方法只有一个接收操作模式的参数,操作模式和Context类中的getSharedPreferences方法中的操作模式一样,没有文件名参数是因为这个方法会自动将当前活动的类名作为SharedPreferences文件的文件名。
- PreferenceManager类中的getDefaultSharedPreference(Context context)方法:这是一个静态方法,只有一个上下文参数,会自动使用当前应用程序的包名作为前缀来命名SharedPreferences文件。不过这个方法已经在Android 10被废弃了,不建议使用了。
获取到SharedPreferences对象后,如果要存储数据,则需要调用SharedPreferences对象的edit()方法获取一个编辑器SharedPreferences.Editor对象,用于修改SharedPreferences对象中的值的接口。用putString()、putInt()、putBoolean()等这种方法来向SharedPreferences.Editor对象中添加键值对数据,这些方法都有两个参数,第一个是参数是键,即要存放数据的名字,第二个参数是要存放的值。最后再调用apply()方法将添加的数据提交就可以了,这样就完成了数据存储操作。
如果要取出存储的数据,则获得要读取的SharedPreferences对象的实例后,再调用相应的getString()、getInt()、getBoolean()等方法就可以了,这些get方法也要传两个参数,第一个参数和put方法一样,为要取出数据的键,即名字;第二个参数是默认值,即表示当传入的键找不到对应的值时会返回默认值。
存入代码:
SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit(); editor.putString("name","tom"); editor.putInt("age",18); editor.apply();
读出代码:
SharedPreferences pref = getSharedPreferences("data",MODE_PRIVATE); String name = pref.getString("name",""); int age = pref.getInt("age",0);
参考Android帮助文档注意:这个类提供了强一致性保证。它使用了昂贵的操作,可能会降低应用程序的运行速度。经常改变属性或者可以容忍损失的属性应该使用其他机制。
SharedPreferences.Editor接口还提供了一些其他方法:
- clear():是把之前提交后保存的所有信息全部进行清空,同一次提交进行的操作如果含有clear()操作,则先执行clear()再执行其他,与代码前后顺序没有关系。
- commit():和apply()方法作用差不多,不过这个会有返回值,写入成功返回true,失败返回false。但是更推荐使用apply()方法,因为apply() 方法进行提交会先将数据写入内存,然后异步写入磁盘,commit()方法是直接写入磁盘。如果频繁操作的话 apply() 的性能会优于 commit(),apply()会将最后修改内容写入磁盘。但是如果希望立刻获取存储操作的结果,并据此做相应的其他操作,应当使用 commit()。
- remove(String key):传入要删除数据的键,然后再提交后进行实际删除。