目录

一. 使用SharedPreferences存储数据

二. 数据的存储位置和格式

三、存储数据的获取

四. 存取复杂类型的数据

五. 设置数据文件的访问权限


Hello,你好呀,我是灰小猿,一个超会写bug的程序猿!

时隔好几天,我又回来了,最近一直忙着考试没时间更新~

今天来和大家分享一篇有关Android中数据存储的文章,它可以说是Android对数据的所有存储方式中最简单的一种存储了,它就是SharedPreferences.

这篇文章,我将详细的和大家讲一下如何使用SharePreferences进行数据的存储和读取,

一. 使用SharedPreferences存储数据

使用SharedPreferences进行存储的数据是存放在一个XML文件中的,同时它的存储方式是是以key-value的形式,key对应着将要存储的数据的名称,value对应存储的值,

使用 SharedPreferences 保存key-value对的步骤一般是这样

1、使用Activity类的getSharedPreferences方法获取到 SharedPreferences 对象,并且在其中指定文件名和该文件的访问权限。在使用该方法时,如果该名称的文件不存在就创建爱你它,如果存在就直接打开。

SharedPreferences sharedPreferences = getSharedPreferences("logininfo", MODE_PRIVATE);

其中的第一个参数是文件名,第二个参数是访问权限,我们平常都会将其访问权限设置为private类型,以保护数据不被外界所访问

2、通过sharedPreferences的edit()方法,我们可以获取到该对象的修改权限,并返回SharedPreferences.Editor对象,

SharedPreferences.Editor edits = sharedPreferences.edit();

3、使用该对象的 putXxx方法保存key-value对。如我们要在文件中保存用户名为“张三”的这条信。

edits.putString("username",张三);

4、通过SharedPreferences.Editor的commit方法保存(提交)key-value对。这样该条信息就会被写入到文件中,并且在不删除的情况下会一直保存。

edits.commit();

下面我们通过一个实例来完整的看下数据存储到SharedPreferences的过程,存储用户登录的用户名和密码。

//获取一个文件名为login、权限为private的xml文件的SharedPreferences对象
SharedPreferences sharedPreferences = getSharedPreferences("login", MODE_PRIVATE);//得到SharedPreferences.Editor对象,并保存数据到该对象中
SharedPreferences.Editor editor = sharedPreferences.edit();//保存key-value对到文件中
editor.putString("username", “灰小猿”);
editor.putString("password", “123456”);editor.commit();

我们上面也说过,使用该对象的 putXxx方法保存key-value对。

所以 SharedPreferences 提供可以直接保存的数据格式肯定不仅只有String,还有 int、boolean、float、long以及Set<String>。但是存储数据的方式都是一样的步骤。

二. 数据的存储位置和格式

既然是将数据存储到了文件中,那么总会有文件的存储位置的,实际上,SharedPreferences 将数据文件写在了手机内存私有的目录中该app的文件夹下。

下面是在AndroidStudio中查看该文件的方法。

首先打开手机文件的存放目录【File Explorer】,在里面找到data\data\程序包名\shared_prefs目录,

就可以发现你命名的login.xml文件。

点击文件并查看:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map><string name="username">灰小猿</string><string name="password">123456</string>
</map>

三、存储数据的获取

上面我们已经讲解了如何对数据进行存储,那么这些存储的数据我们是应该如何获取的呢?

其实通过sharedPreferences存储的数据的读取也是十分容易的,我们只需要使用getSharedPreferences()方法获取到对应的XML文件之后,使用其getXxx方法传入存储时的key即可,

代码如下:

SharedPreferences sharedPreferences = getSharedPreferences("logininfo", MODE_PRIVATE);
String username = sharedPreferences.getString("username", "");
String password = sharedPreferences.getString("password", "");

其中的getString()方法中的第一个参数是key的名称,

第二个参数的含义是:“如果没有找到以该key存储的value,那就返回该参数”,如上代码,没有相应的username或password的话就返回“”。

四. 存取复杂类型的数据

如果要用 SharedPreferences 存取复杂的数据类型(类,图像等),就需要对这些数据进行编码。通常会将复杂类型的数据转换成Base64编码,然后将转换后的数据以字符串的形式保存在XML文件中。

实例:
使用 SharedPreferences 保存Product类的一个对象和一张图片。

这里提供了两个Button,用来保存和获取使用 SharedPreferences 保存的Product对象和图片。

保存按钮的点击事件:

bt_prod_save.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {try {//保存对象Product product = new Product();product.setId(et_prod_id.getText().toString().trim());product.setName(et_prod_name.getText().toString().trim());SharedPreferences sharedPreferences = getSharedPreferences("base64", MODE_PRIVATE);SharedPreferences.Editor editor = sharedPreferences.edit();ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(product);String base64Product = Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT);editor.putString("product", base64Product);//保存图片ByteArrayOutputStream baos2 = new ByteArrayOutputStream();((BitmapDrawable) getResources().getDrawable(R.drawable.lanbojini)).getBitmap().compress(Bitmap.CompressFormat.JPEG, 100, baos2);String imageBase64 = Base64.encodeToString(baos2.toByteArray(), Base64.DEFAULT);editor.putString("productImg", imageBase64);editor.commit();baos.close();oos.close();Toast.makeText(MainActivity.this, "保存成功!!!", Toast.LENGTH_SHORT).show();} catch (Exception e) {Toast.makeText(MainActivity.this, "保存出错了!!!" + e.getMessage(), Toast.LENGTH_SHORT).show();}}});

回显按钮的点击事件:

bt_prod_show.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {try {//获取对象et_prod_id = (EditText) findViewById(R.id.et_prod_id);et_prod_name = (EditText) findViewById(R.id.et_prod_name);SharedPreferences sharedPreferences = getSharedPreferences("base64", MODE_PRIVATE);String productString = sharedPreferences.getString("product", "");byte[] base64Product = Base64.decode(productString, Base64.DEFAULT);ByteArrayInputStream bais = new ByteArrayInputStream(base64Product);ObjectInputStream ois = new ObjectInputStream(bais);Product product = (Product) ois.readObject();et_prod_id.setText(product.getId());et_prod_name.setText(product.getName());//获取图片iv_prod_img = (ImageView) findViewById(R.id.iv_prod_img);byte[] imagByte = Base64.decode(sharedPreferences.getString("productImg",""), Base64.DEFAULT);ByteArrayInputStream bais2 = new ByteArrayInputStream(imagByte);iv_prod_img.setImageDrawable(Drawable.createFromStream(bais2,  "imagByte"));} catch (Exception e) {e.printStackTrace();}}});

原理:使用Base64把Product对象和图片进行编码成字符串后,然后通过 SharedPreferences 把转换后的字符串保存到xml文件中,在需要使用该对象或者图片时,通过Base64把从 SharedPreferences 获取的字符串解码成对象或者图片再使用。

查看base64.xml 文件,会看到如下内容:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map><string name="productImg">/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDABALDA4MChAOoOjM9PDkz......</string><string name="product">rO0ABXNyACNjbHViLmxldGdldC50ZXN0c2hhGJqb......</string>
</map>

注意:
虽然可以采用编码的方式通过 SharedPreferences 保存任何类型的数据,但不建议使用 SharedPreferences 保存尺寸很大的数据。如果要存取更多的数据,一般使用文件存储、SQLite数据库等技术。

五. 设置数据文件的访问权限

我们知道Android系统本质上是Linux,那么Android文件权限也和Linux一致。Linux文件属性分为4段,
第一段:

  • [d]:表示目录
  • [-]:表示文件
  • [l]:表示链接文件
  • [b]:表示可供存储的接口设备文件
  • [c]:表示串口设备文件,例如键盘、鼠标

第二段:

  • [r]:表示可读
  • [w]:表示可写
  • [x]:表示可执行

如果不具备某个属性,该项将以[-]代替,例如rw-、--x等
第三段和第四段和第二段相同,区别在于,第二段表示文件所有者拥有的权限,第三段表示文件所有者所在的用户组中其他用户的权限,第四段表示其他用户的权限。

例如:-rw-rw-rw,表示这是一个文件,并且该用户和该组内其他用户和其他用户的权限都为可读和可写不可执行。

那么现在来对比一下我们这篇文章中文件的存储权限,我们在获取 SharedPreferences 对象时,使用的是下面这行代码:
SharedPreferences sharedPreferences = this.getSharedPreferences("test", MODE_PRIVATE);
其中getSharedPreferences方法第二个参数就是对文件权限的描述。

这个参数有四个可选值:

  • Activity.MODE_PRIVATE:表示该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
  • Activity.MODE_APPEND:也是私有数据,新写入的内容会追加到原文件中
  • Activity.MODE_WORLD_READABLE:表示当前文件可以被其他应用读取
  • Activity.MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入

但是出于对数据文件安全性的考虑,我们一般使用MODE_PRIVATE权限对文件进行存储。

好了,关于Android中使用SharedPreferences对数据进行存储的方法就和大家分享到这里,

有问题的小伙伴可以评论区留言或者添加我的微信!

我是灰小猿,我们下期见!

深入剖析Android中最简单的数据存储方式:SharedPreferences相关推荐

  1. Android中的5种数据存储方式

    Android中的5种数据存储方式 Android中的5种数据存储方式 数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是: 1 使用SharedPref ...

  2. android新闻列表,Android中实现简单的新闻列表

    Android中实现简单的新闻列表 在刚开始写CSDN的时候,写过一篇 Android中通过ListView实现简单的新闻列表 最近看到有很多刚开始学习Android的同学需要源码.不好意思的是,那个 ...

  3. Android解析xml的方法,Android中解析XML格式数据的方法

    XML介绍:Extensible Markup Language,即可扩展标记语言 一.概述 Android中解析XML格式数据大致有三种方法: SAX DOM PULL 二.详解 2.1 SAX S ...

  4. Android的5中主要的数据存储方式

    Android有5中主要的数据存储方式: 1.Android本身的数据库(SQLite数据库):SQlite是一个轻量级的.跨平台的数据库.占用内存小,支持基本的SQL语法,通常用于存储用户信息. 2 ...

  5. android 时间戳 转日期格式,在Android中转换为简单日期格式或Unix时间戳日期?

    我收到日期(2015-03-20T06:34:01.831183 + 01:00)从服务器这不是简单的日期格式,我想这种类型的日期转换为简单的日期格式一样(yyyyMMddHHmmssSSSS)在An ...

  6. Android中绘制简单几何图形和路径Path

    背景 我的博客:http://zhangsunyucong.top 马上就到2018年过年了,然后我又刚好有兴致,就来玩玩Android中的简单几何图形的绘制和使用Path类来绘制路径. Path和C ...

  7. android linearlayout最大高度,Android中最简单最常用的LinearLayout线性布局

    原标题:Android中最简单最常用的LinearLayout线性布局 良好的布局设计对于UI界面至关重要,在前面也简单介绍过,目前Android中的布局主要有6种,创建的布局文件默认为Relativ ...

  8. android界面数据存储,Android应用开发基础之数据存储和界面展现(二)

    Android应用开发基础之数据存储和界面展现(二) 常见布局 相对布局 RelativeLayout 组件默认左对齐.顶部对齐 设置组件在指定组件的右边 android:layout_toRight ...

  9. [转]Android中程序与Service交互的方式——交互方式

    本文转自:http://blog.csdn.net/yihongyuelan/article/details/7216188 上一篇文章:Android中程序与Service交互的方式--综述 简述了 ...

最新文章

  1. python中字符串的常见操作方法
  2. Spring-Data-JPA入门--增删改查1
  3. vue项目中vue-echarts讲解及常用图表方案实现
  4. Java字符串与日期互转
  5. 大鱼风控笔记 1:量化风控体系的风险板块
  6. 4599 的 iPhone 11,拼多多如何从「真香」到「更香」
  7. Windows8 商店支付功能
  8. Centos7 tomcat优化
  9. 白帽子讲web安全读后感2
  10. lintcode 168. 吹气球 动态规划
  11. 极光短信验证码服务器,极光推送的短信验证使用
  12. 数据开源 | 跨境电商场景中日平行语料1000
  13. because it violates the following Content Security Policy directive: “default-src ‘none‘“
  14. JS修改style样式
  15. SiT5711:±5~±8ppb超高精度Stratum 3E恒温振荡器OCXO,1-60MHz
  16. 阿里云服务器ECS由什么组成
  17. 联想小新padpro怎么样?测评值得买吗?详细性能点评
  18. java计算机毕业设计慧学IT精品课程网站MyBatis+系统+LW文档+源码+调试部署
  19. 作为打工人,我在《我要投资》里看到了职场生存法则
  20. 新版本发布,新增监控插件与驱动

热门文章

  1. 应用时间序列分析清华大学出版社电子版_数据分析模型9——预知未来的算法:时间序列分析...
  2. 新概念二册 Lesson 45 A clear conscience问心无愧(复习被动语态+过去完成时被动语态)
  3. 被动语态和非谓语区别_判断非谓语动词是否用被动式的三个技巧
  4. vMotion及Storage vMotion配置
  5. 近似查询mysql_近似查询处理简介
  6. 解析大乐透,预测股票信息入库
  7. 【深圳】工作5年,欠款1万5,是否还有必要待下去呢?
  8. 如何用自己电脑架设服务器
  9. c语言常数-ox6a是什么意思,C语言第2讲-数据类型运算符和表达式.pdf
  10. ZYNQ7000 FSBL加载启动代码详解