Android存储--SharedPreferences

采得百花成蜜后,为谁辛苦为谁甜。这篇文章主要讲述Android存储--SharedPreferences相关的知识,希望能为你提供帮助。
简介在android中,主要有以下几种存储方式:

  1. SharedPreferences,在键值对中存储私有原始数据。
  2. 内部存储,在设备内存中存储私有数据。
官方示例:
String FILENAME = " hello_file" ; String string = " hello world!" ; FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); fos.write(string.getBytes()); fos.close();

  1. 外部存储,在共享的外部存储中存储公共数据。
使用外部存储,需要获取外部存储的读写权限。
外部存储主要包括存储公用文件(与其他应用共享)和不愿共享的私有文件以及缓存。
官方示例:
公有文件:以下方法在公共图书目录中创建了一个用于新相册的目录:
public File getAlbumStorageDir(String albumName) { // Get the directory for the user‘s public pictures directory. File file = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), albumName); if (!file.mkdirs()) { Log.e(LOG_TAG, " Directory not created" ); } return file; }

  1. sqlite数据库
在私有的数据库中存储结构化的数据
创建新 SQLite 数据库的推荐方法是创建 SQLiteOpenHelper 的子类并覆盖 onCreate() 方法,在此方法中,您可以执行 SQLite 命令以创建数据库中的表。
官方示例:
public class DictionaryOpenHelper extends SQLiteOpenHelper {private static final int DATABASE_VERSION = 2; private static final String DICTIONARY_TABLE_NAME = " dictionary" ; private static final String DICTIONARY_TABLE_CREATE = " CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" + KEY_WORD + " TEXT, " + KEY_DEFINITION + " TEXT); " ; DictionaryOpenHelper(Context context) { super(context, DATABASE_NAE, null, DATABASE_VERSION); }@Override public void onCreate(SQLiteDatabase db) { db.execSQL(DICTIONARY_TABLE_CREATE); } }

回到我们的重点,SharedPreferences。SharedPreferences是安卓数据存储的一个框架,它可以方便地存储和读取永久性键值对数据。SharedPreferences可以用来存储任何基本类型的数据,如String、Int等,注意它的存储是永久性的,也就是应用关闭后,它依然保留着。
SharedPreferences的使用
  1. 要读取SharePreferences存储的数据,首先要获得SharedPreferences的对象:
  • getSharedPreferences()-如果需要多个按名称识别的首选项文件,使用此方法
  • getPreferences()-如果只需要一个用于Activity的首选项文件,使用此方法。
  1. 存储数据时,
  2. 调用edit()以获得SharedPreferences.Editor
  3. 使用 putBoolean() 和 putString() 等方法添加值
  4. 使用 commit() 提交新值
示例代码:
package com.meituan.huangdanyang.practise; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.support.design.widget.TabLayout; import android.support.v4.view.ViewPager; import android.view.View; import android.widget.ImageButton; import android.widget.LinearLayout; import com.meituan.huangdanyang.practise.BaseActivity; import java.util.List; public class MainActivity extends BaseActivity { private final static String MY_PRE_NAME = " my preferences" ; private final static String MY_PRE_STRING_KEY = " KEY1" ; private final static String MY_PRE_INT_KEY = " KEY2" ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SharedPreferences preferences = getSharedPreferences(MY_PRE_NAME, Context.MODE_PRIVATE); System.out.println(MY_PRE_STRING_KEY + " " + preferences.getString(MY_PRE_STRING_KEY, " NULL" )); System.out.println(MY_PRE_INT_KEY + " " + preferences.getInt(MY_PRE_INT_KEY, 0)); SharedPreferences.Editor editor = preferences.edit(); editor.putString(MY_PRE_STRING_KEY, this.toString()); editor.putInt(MY_PRE_INT_KEY, this.hashCode()); editor.apply(); }@Override protected void onStop() { super.onStop(); SharedPreferences preferences = getSharedPreferences(MY_PRE_NAME, Context.MODE_PRIVATE); if (preferences.contains(MY_PRE_STRING_KEY)) { System.out.println(MY_PRE_STRING_KEY + " " + preferences.getString(MY_PRE_STRING_KEY, " NULL" )); } if (preferences.contains(MY_PRE_INT_KEY)) { System.out.println(MY_PRE_INT_KEY + " " + preferences.getInt(MY_PRE_INT_KEY, 0)); } }@Override protected String getName() { return " MainActivity" ; }}

如上,存储activity的对象名字和hashcode。
【Android存储--SharedPreferences】更多相关的方法:
package ******import android.content.Context; import android.content.SharedPreferences; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Map; public class SPUtils { public SPUtils() { /* cannot be instantiated */ throw new UnsupportedOperationException(" cannot be instantiated" ); } /** * 保存在手机里面的文件名 */ public static final String FILE_NAME = " share_data" ; /** * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法 * * @param context * @param key * @param object */ public static void put(Context context, String key, Object object) {SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); if (object instanceof String) { editor.putString(key, (String) object); } else if (object instanceof Integer) { editor.putInt(key, (Integer) object); } else if (object instanceof Boolean) { editor.putBoolean(key, (Boolean) object); } else if (object instanceof Float) { editor.putFloat(key, (Float) object); } else if (object instanceof Long) { editor.putLong(key, (Long) object); } else { editor.putString(key, object.toString()); }SharedPreferencesCompat.apply(editor); } /** * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值 * * @param context * @param key * @param defaultObject * @return */ public static Object get(Context context, String key, Object defaultObject) { SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE); if (defaultObject instanceof String) { return sp.getString(key, (String) defaultObject); } else if (defaultObject instanceof Integer) { return sp.getInt(key, (Integer) defaultObject); } else if (defaultObject instanceof Boolean) { return sp.getBoolean(key, (Boolean) defaultObject); } else if (defaultObject instanceof Float) { return sp.getFloat(key, (Float) defaultObject); } else if (defaultObject instanceof Long) { return sp.getLong(key, (Long) defaultObject); }return null; } /** * 移除某个key值已经对应的值 * * @param context * @param key */ public static void remove(Context context, String key) { SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); editor.remove(key); SharedPreferencesCompat.apply(editor); } /** * 清除所有数据 * * @param context */ public static void clear(Context context) { SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); editor.clear(); SharedPreferencesCompat.apply(editor); } /** * 查询某个key是否已经存在 * * @param context * @param key * @return */ public static boolean contains(Context context, String key) { SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE); return sp.contains(key); } /** * 返回所有的键值对 * * @param context * @return */ public static Map< String, ?> getAll(Context context) { SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE); return sp.getAll(); } /** * 创建一个解决SharedPreferencesCompat.apply方法的一个兼容类 * * @author zhy * */ private static class SharedPreferencesCompat { private static final Method sApplyMethod = findApplyMethod(); /** * 反射查找apply的方法 * * @return */ @SuppressWarnings({ " unchecked" , " rawtypes" }) private static Method findApplyMethod() { try { Class clz = SharedPreferences.Editor.class; return clz.getMethod(" apply" ); } catch (NoSuchMethodException e) { }return null; }/** * 如果找到则使用apply执行,否则使用commit * * @param editor */ public static void apply(SharedPreferences.Editor editor) { try { if (sApplyMethod != null) { sApplyMethod.invoke(editor); return; } } catch (IllegalArgumentException e) { } catch (IllegalAccessException e) { } catch (InvocationTargetException e) { } editor.commit(); } }}



    推荐阅读