【专业技术】Android数据保存之SharedPreferences

前言:

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

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

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

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

获取SharedPreferences对象:

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

1、getSharedPreferences(String name, int mode)

此方通通过Context对象调用,返回一个唯一的SharedPreferences对象,这里的唯一指的是通过name来查找的唯一对应的SharedPreferences,如果没有查找到则会用name来创建一个。唯一的好处就是你在一个地方保存后在另外的地方立刻就能读取到这个值。用mode来区分创建的SharedPreferences对象共享类型,MODE_PRIVATE表示该应用程序私有,MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE是表示全局读或写权限,MODE_MULTI_PROCESS表示可以跨进程访问。

2、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)

原文发表时间:2015-07-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏刘望舒

Android事件总线(一)EventBus3.0用法全解析

前言 EventBus是一款针对Android优化的发布/订阅事件总线。简化了应用程序内各组件间、组件与后台线程间的通信。优点是开销小,代码更优雅,以及将发送者...

2229
来自专栏跟着阿笨一起玩NET

Linq to Object实现分页获取数据

本文参考博客:http://www.cnblogs.com/wintersun/archive/2009/10/06/1578401.html

522
来自专栏非著名程序员

玩转EventBus,详解其使用

? 概述 EventBus是一款针对Android优化的发布/订阅(publish/subscribe)事件总线。主要功能是替代Intent,Handler,...

1916
来自专栏积累沉淀

Java SWT事件

什么是事件?点击鼠标是一个事件,按下一个按钮也一个事件,关闭一个窗口也是一个事件。 什么是监听器?监听器就是监听事件什么时候发生的,用来控制事件发生的具体动...

1785
来自专栏Sorrower的专栏

界面无小事(八):RecyclerView增删item

1013
来自专栏androidBlog

归并排序 递归版和非递归版的实现(java)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/...

1161
来自专栏程序员互动联盟

Android编程规范

命名规则: 1). 类名,接口名: 以大写开头,如果一个类的类名由多个单词组成,所有单词的首字母必须大写,单词尽量写全称,不要简写,除非约定俗成的名字,例如:...

3917
来自专栏糊一笑

移动端效果之IndexList

写在前面 接着前面的移动端效果讲,这次讲解的的是IndexList的实现原理。效果如下: ? 代码请看这里:github 移动端效果之swiper 移动端效果之...

2014
来自专栏三流程序员的挣扎

Android 动画总结(9) - 过渡动画

前面已经介绍过一部分 Activity 之间的过渡动画。现在讲的不是 Activity 转场,而是同一个页面的 View 之间的过渡。

1061
来自专栏菩提树下的杨过

Silverlight:纠结的快捷键问题

如果SL是以浏览器模式运行的,要想找到满意的快捷键,通常会让人郁闷,因为浏览器会优先拦截掉大部分默认的快捷键,如果您还安装了某些IE插件,它们的优先级也比SL高...

18410

扫码关注云+社区