前言:

程序中处理的大部分问题都与数据有关,读取数据显示在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的方法和注意事项,有哪些地方写的不好还请大神们批评指正。下一篇文章继续聊Android中的数据保存之文件保存,谢谢大家!

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

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

Android数据保存之SharedPreference的更多相关文章

  1. Android数据保存之文件保存

    前言: 上一篇文章写了在Android中利用SharedPreferences保存数据,SharedPreferences在保存数据的时候主要是保存一些应用程序的设置信息或者少量的用户信息,并且是以k ...

  2. android数据保存

    永久保存数据的方法:1.Shared Preferences 以键值对的形式存储基本数据类型( booleans, floats, ints, longs, and strings),存储的数据在限制 ...

  3. android数据保存之greendao

    有时我们的数据属于保存到数据库,对于Android应用和IOS应用,我们一般都会使用SQLite这个嵌入式的数据库作为我们保存数据的工具.由于我们直接操作数据库比较麻烦,而且管理起来也非常的麻烦,以前 ...

  4. MTK Android Android数据保存到系统数据库

    如果有留意Android中系统设置Settings里面的源码,你会发现代码中频繁用到了Settings.System操作,该类通过键值对的形式,将一些特定的值以全局的模式保存到Setting的数据库中 ...

  5. Android中的数据保存

    形式 Android的数据保存分为3种形式:file, SharedPreference, Database 文件 主要思想就是通过Context类中提供的openFileInput和openFile ...

  6. Android少量数据保存之SharedPreferences接口实例

    SharedPreferences数据保存主要是通过键值的方式存储在xml文件中 xml文件在data/此程序的包名/XX.xml 格式 <?xml version='1.0' encoding ...

  7. Android数据存储(1)少量数据保存之SharedPreferences接口实例

    SharedPreferences数据保存主要是通过键值的方式存储在xml文件中 xml文件在data/此程序的包名/XX.xml 格式 <?xml version='1.0' encoding ...

  8. android之保存偏好设置信息到shareSharedPreferences,轻量级的保存数据的方法

    android之保存偏好设置信息到shareSharedPreferences,轻量级的保存数据的方法   SharedPreferences保存数据到xml文件 有时候要保存activity的某些状 ...

  9. [Android] Android GreenDao 保存 JavaBean 或者List <JavaBean>类型数据

    Android GreenDao 保存 JavaBean 或者List <JavaBean>类型数据 简介 数据库存储数据基本上每个APP都有用到,GreenDAO 是一个将对象映射到 S ...

随机推荐

  1. W7500S2E串口转以太网

    概述 W7500S2E是一系列串口转以太网模块,支持TCP Server.TCP Client和UDP三种工作模式,串口波特率最高可达460,800bps,并提供配套的上位机配置软件,也可通过网页或A ...

  2. squid 透明代理配置

    阿铭在教程中已经介绍过squid的安装和配置,http://study.lishiming.net/chapter22.html 教程中只介绍了初级的正向代理和反向代理,这篇文档将要介绍透明代理如何配 ...

  3. 使用kbmmw 的REST 服务实现上传大文件

    我们在使用kbmmw的REST 服务时,经常会下载和上传大文件.例如100M以上的.kbmmw的rest服务中 提供标准的文件下载,上传功能,基本上就是打开文件,发送,接收,没有做特殊处理.这些对于文 ...

  4. 每日一练ACM 2019.0417

    Problem Description 给定两个正整数,计算这两个数的最小公倍数.   Input 输入包含多组测试数据,每组只有一行,包括两个不大于1000的正整数.   Output 对于每个测试 ...

  5. consul搭建

    1.准备3台服务器 linux1 192.168.0.101 linux2 192.168.0.102 linux3 192.168.0.103 2.准备向Linux上传文件的工具Winscp 3.去 ...

  6. cropper.js 裁剪图片

    https://blog.csdn.net/weixin_38023551/article/details/78792400

  7. 关于Bell数的一道题目

      考虑 T3+1  {1,2,3,4} T3是3个元素的划分,如果在里面加入子集{4},   4被标成特殊元素,  就形成了T4一类的划分(里面的子集的并集是{1,2,3,4}) T2是2个元素的划 ...

  8. Object constructor

    1. Object is an instance of Function.2. Object does not have a property called constructor so when w ...

  9. CDR锁定方式

    每个通道的PMA包括一个通道PLL可以配置成接收器CDR.还可以把通道1和4的PLL配置成CMU PLL用于发送器. CDR有两种锁定方式 1.Lock-to-Reference Mode(LTR) ...

  10. 【收藏】JS获取鼠标的X,Y坐标位置

    JS的方法: <html> <head> <meta http-equiv="Content-Type" content="text/htm ...