简介

在Android中,主要有以下几种存储方式:

  1. SharedPreferences,在键值对中存储私有原始数据。
  2. 内部存储,在设备内存中存储私有数据。

官方示例:

  1. String FILENAME = "hello_file";
  2. String string = "hello world!";
  3. FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
  4. fos.write(string.getBytes());
  5. fos.close();
  1. 外部存储,在共享的外部存储中存储公共数据。

使用外部存储,需要获取外部存储的读写权限。

外部存储主要包括存储公用文件(与其他应用共享)和不愿共享的私有文件以及缓存。

官方示例:

公有文件:以下方法在公共图书目录中创建了一个用于新相册的目录:

  1. public File getAlbumStorageDir(String albumName) {
  2. // Get the directory for the user's public pictures directory.
  3. File file = new File(Environment.getExternalStoragePublicDirectory(
  4. Environment.DIRECTORY_PICTURES), albumName);
  5. if (!file.mkdirs()) {
  6. Log.e(LOG_TAG, "Directory not created");
  7. }
  8. return file;
  9. }
  1. sqlite数据库

在私有的数据库中存储结构化的数据

创建新 SQLite 数据库的推荐方法是创建 SQLiteOpenHelper 的子类并覆盖 onCreate() 方法,在此方法中,您可以执行 SQLite 命令以创建数据库中的表。

官方示例:

  1. public class DictionaryOpenHelper extends SQLiteOpenHelper {
  2. private static final int DATABASE_VERSION = 2;
  3. private static final String DICTIONARY_TABLE_NAME = "dictionary";
  4. private static final String DICTIONARY_TABLE_CREATE =
  5. "CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +
  6. KEY_WORD + " TEXT, " +
  7. KEY_DEFINITION + " TEXT);";
  8. DictionaryOpenHelper(Context context) {
  9. super(context, DATABASE_NAE, null, DATABASE_VERSION);
  10. }
  11. @Override
  12. public void onCreate(SQLiteDatabase db) {
  13. db.execSQL(DICTIONARY_TABLE_CREATE);
  14. }
  15. }

回到我们的重点,SharedPreferences。SharedPreferences是安卓数据存储的一个框架,它可以方便地存储和读取永久性键值对数据。SharedPreferences可以用来存储任何基本类型的数据,如String、Int等,注意它的存储是永久性的,也就是应用关闭后,它依然保留着。

SharedPreferences的使用

  1. 要读取SharePreferences存储的数据,首先要获得SharedPreferences的对象:
  • getSharedPreferences()-如果需要多个按名称识别的首选项文件,使用此方法
  • getPreferences()-如果只需要一个用于Activity的首选项文件,使用此方法。
  1. 存储数据时,

  2. 调用edit()以获得SharedPreferences.Editor

  3. 使用 putBoolean() 和 putString() 等方法添加值

  4. 使用 commit() 提交新值

示例代码:

  1. package com.meituan.huangdanyang.practise;
  2. import android.content.Context;
  3. import android.content.SharedPreferences;
  4. import android.os.Bundle;
  5. import android.support.design.widget.TabLayout;
  6. import android.support.v4.view.ViewPager;
  7. import android.view.View;
  8. import android.widget.ImageButton;
  9. import android.widget.LinearLayout;
  10. import com.meituan.huangdanyang.practise.BaseActivity;
  11. import java.util.List;
  12. public class MainActivity extends BaseActivity {
  13. private final static String MY_PRE_NAME = "my preferences";
  14. private final static String MY_PRE_STRING_KEY = "KEY1";
  15. private final static String MY_PRE_INT_KEY = "KEY2";
  16. @Override
  17. protected void onCreate(Bundle savedInstanceState) {
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.activity_main);
  20. SharedPreferences preferences = getSharedPreferences(MY_PRE_NAME, Context.MODE_PRIVATE);
  21. System.out.println(MY_PRE_STRING_KEY + " " + preferences.getString(MY_PRE_STRING_KEY,
  22. "NULL"));
  23. System.out.println(MY_PRE_INT_KEY + " " + preferences.getInt(MY_PRE_INT_KEY, 0));
  24. SharedPreferences.Editor editor = preferences.edit();
  25. editor.putString(MY_PRE_STRING_KEY, this.toString());
  26. editor.putInt(MY_PRE_INT_KEY, this.hashCode());
  27. editor.apply();
  28. }
  29. @Override
  30. protected void onStop() {
  31. super.onStop();
  32. SharedPreferences preferences = getSharedPreferences(MY_PRE_NAME, Context.MODE_PRIVATE);
  33. if (preferences.contains(MY_PRE_STRING_KEY)) {
  34. System.out.println(MY_PRE_STRING_KEY + " " + preferences.getString(MY_PRE_STRING_KEY,
  35. "NULL"));
  36. }
  37. if (preferences.contains(MY_PRE_INT_KEY)) {
  38. System.out.println(MY_PRE_INT_KEY + " " + preferences.getInt(MY_PRE_INT_KEY, 0));
  39. }
  40. }
  41. @Override
  42. protected String getName() {
  43. return "MainActivity";
  44. }
  45. }

如上,存储activity的对象名字和hashcode。

更多相关的方法:

  1. package ******
  2. import android.content.Context;
  3. import android.content.SharedPreferences;
  4. import java.lang.reflect.InvocationTargetException;
  5. import java.lang.reflect.Method;
  6. import java.util.Map;
  7. public class SPUtils
  8. {
  9. public SPUtils()
  10. {
  11. /* cannot be instantiated */
  12. throw new UnsupportedOperationException("cannot be instantiated");
  13. }
  14. /**
  15. * 保存在手机里面的文件名
  16. */
  17. public static final String FILE_NAME = "share_data";
  18. /**
  19. * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
  20. *
  21. * @param context
  22. * @param key
  23. * @param object
  24. */
  25. public static void put(Context context, String key, Object object)
  26. {
  27. SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
  28. Context.MODE_PRIVATE);
  29. SharedPreferences.Editor editor = sp.edit();
  30. if (object instanceof String)
  31. {
  32. editor.putString(key, (String) object);
  33. } else if (object instanceof Integer)
  34. {
  35. editor.putInt(key, (Integer) object);
  36. } else if (object instanceof Boolean)
  37. {
  38. editor.putBoolean(key, (Boolean) object);
  39. } else if (object instanceof Float)
  40. {
  41. editor.putFloat(key, (Float) object);
  42. } else if (object instanceof Long)
  43. {
  44. editor.putLong(key, (Long) object);
  45. } else
  46. {
  47. editor.putString(key, object.toString());
  48. }
  49. SharedPreferencesCompat.apply(editor);
  50. }
  51. /**
  52. * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
  53. *
  54. * @param context
  55. * @param key
  56. * @param defaultObject
  57. * @return
  58. */
  59. public static Object get(Context context, String key, Object defaultObject)
  60. {
  61. SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
  62. Context.MODE_PRIVATE);
  63. if (defaultObject instanceof String)
  64. {
  65. return sp.getString(key, (String) defaultObject);
  66. } else if (defaultObject instanceof Integer)
  67. {
  68. return sp.getInt(key, (Integer) defaultObject);
  69. } else if (defaultObject instanceof Boolean)
  70. {
  71. return sp.getBoolean(key, (Boolean) defaultObject);
  72. } else if (defaultObject instanceof Float)
  73. {
  74. return sp.getFloat(key, (Float) defaultObject);
  75. } else if (defaultObject instanceof Long)
  76. {
  77. return sp.getLong(key, (Long) defaultObject);
  78. }
  79. return null;
  80. }
  81. /**
  82. * 移除某个key值已经对应的值
  83. *
  84. * @param context
  85. * @param key
  86. */
  87. public static void remove(Context context, String key)
  88. {
  89. SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
  90. Context.MODE_PRIVATE);
  91. SharedPreferences.Editor editor = sp.edit();
  92. editor.remove(key);
  93. SharedPreferencesCompat.apply(editor);
  94. }
  95. /**
  96. * 清除所有数据
  97. *
  98. * @param context
  99. */
  100. public static void clear(Context context)
  101. {
  102. SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
  103. Context.MODE_PRIVATE);
  104. SharedPreferences.Editor editor = sp.edit();
  105. editor.clear();
  106. SharedPreferencesCompat.apply(editor);
  107. }
  108. /**
  109. * 查询某个key是否已经存在
  110. *
  111. * @param context
  112. * @param key
  113. * @return
  114. */
  115. public static boolean contains(Context context, String key)
  116. {
  117. SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
  118. Context.MODE_PRIVATE);
  119. return sp.contains(key);
  120. }
  121. /**
  122. * 返回所有的键值对
  123. *
  124. * @param context
  125. * @return
  126. */
  127. public static Map<String, ?> getAll(Context context)
  128. {
  129. SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
  130. Context.MODE_PRIVATE);
  131. return sp.getAll();
  132. }
  133. /**
  134. * 创建一个解决SharedPreferencesCompat.apply方法的一个兼容类
  135. *
  136. * @author zhy
  137. *
  138. */
  139. private static class SharedPreferencesCompat
  140. {
  141. private static final Method sApplyMethod = findApplyMethod();
  142. /**
  143. * 反射查找apply的方法
  144. *
  145. * @return
  146. */
  147. @SuppressWarnings({ "unchecked", "rawtypes" })
  148. private static Method findApplyMethod()
  149. {
  150. try
  151. {
  152. Class clz = SharedPreferences.Editor.class;
  153. return clz.getMethod("apply");
  154. } catch (NoSuchMethodException e)
  155. {
  156. }
  157. return null;
  158. }
  159. /**
  160. * 如果找到则使用apply执行,否则使用commit
  161. *
  162. * @param editor
  163. */
  164. public static void apply(SharedPreferences.Editor editor)
  165. {
  166. try
  167. {
  168. if (sApplyMethod != null)
  169. {
  170. sApplyMethod.invoke(editor);
  171. return;
  172. }
  173. } catch (IllegalArgumentException e)
  174. {
  175. } catch (IllegalAccessException e)
  176. {
  177. } catch (InvocationTargetException e)
  178. {
  179. }
  180. editor.commit();
  181. }
  182. }
  183. }

Android存储--SharedPreferences的更多相关文章

  1. Android之SharedPreferences数据存储

    一.SharedPreferences保存数据介绍 如果有想要保存的相对较小键值集合,应使用SharedPreferences API.SharedPreferences对象指向包含键值对的文件并提供 ...

  2. 18.Android之SharedPreferences数据存储学习

    SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的就是一个key-value(键值对)SharedPreferences常用来 ...

  3. Android存储之SharedPreferences

    Android数据存储之SharedPreferences SharedPreferences对象初始化 SharedPreferences mSharedPreferences = getShare ...

  4. Android笔记(三十八) Android中的数据存储——SharedPreferences

    SharedPreferences是Android提供的一种轻型的数据存储方法,其本质是基于xml文件存储的,内部数据以key-value的方式存储,通常用来存储一些简单的配置信息. SharedPr ...

  5. Android 使用SharedPreferences数据存储

    自己写了个SP辅助类 尽管写的有点啰嗦,也是自己的成果.例如以下: package com.yqy.yqy_testsputil; import android.annotation.Suppress ...

  6. android.content.SharedPreferences.edit()

    今天在实现一个保存用户设置到SharedPreferences时,出现了一个不能将数据保存到SharedPreferences中的情况.经过仔细的分析得出: android.content.Share ...

  7. android中sharedPreferences的用法

    SharedPreferences介绍:   做软件开发应该都知道,很多软件会有配置文件,里面存放这程序运行当中的各个属性值,由于其配置信息并不多,如果采用数据库来存放并不划算,因为数据库连接跟操作等 ...

  8. Android的SharedPreferences实用技巧

    转自:http://blog.csdn.net/jingfeizhu/article/details/10017779 SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XM ...

  9. Android中SharedPreferences和序列化结合保存对象数据

    前言: 最近在做用户注册的时候,遇到了需要填写很多表单数据,不可能在一页把所有的数据都展示完全,因此采用了分页的方式,由于在用户填写数据数据之后我们需要对用户填写的数据进行暂时的记录的,当用户会到此页 ...

随机推荐

  1. day10,day11—基本数据类型语法

    一.整形 1. base #在16进制中的位置 num = "b" v = int(num, base=16) print(v) #11 2. bit_length() # 1 1 ...

  2. vue全家桶(4.3)

    5.3.Vuex的核心概念 store: 每一个 Vuex 应用的核心就是 store(仓库)."store"基本上就是一个容器,它包含着你的应用中大部分的状态 (state) s ...

  3. BootstrapDialog.confirm确认对话框

    1. 依赖文件: bootstrap.js bootstrap-dialog.js bootstrap.css bootstrap-dialog.css 2.代码 BootstrapDialog.co ...

  4. 懂了!VMware/KVM/Docker原来是这么回事儿

    云计算时代,计算资源如同小马哥当年所言,已经成为了互联网上的水和电. 虚拟主机.web服务器.数据库.对象存储等等各种服务我们都可以通过各种各样的云平台来完成. 而在云计算欣欣向荣的背后,有一个重要的 ...

  5. 07 . Kubernetes之Service

    kubernetes有三种网络 1. Node Network 2. Pod Network 3. Cluster Network Service-网络代理模式 **userspce: 1.1- ** ...

  6. day03组件

    1.text   编写文本信息,等价于span 2.view 等价于div 3.image ============================wxml====================== ...

  7. Python3笔记005 - 2.2 保留字与标识符

    第2章 python语言基础 python语法特点 保留字与标识符 变量 数据类型 运算符 输入和输出 2.2 保留字与标识符 2.2.1 保留字 查看python保留字 import keyword ...

  8. Linux傻瓜式七步完美安装Python3.7

    1 安装依赖包 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-deve ...

  9. 每日一题 - 剑指 Offer 32 - I. 从上到下打印二叉树

    题目信息 时间: 2019-06-25 题目链接:Leetcode tag:BFS(广度优先搜索) 队列 难易程度:中等 题目描述: 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印 ...

  10. Mister B and PR Shifts,题解

    题目链接 分析: 题意很明白,不再多说了,直接分析题目,首先想一想暴力,直接枚举起点,然后求出来,时间复杂度n*n,显然不太好,所以我们考虑换一种方法枚举,当然本质还是枚举,其实你会发现变化i次和i+ ...