Android數據存儲的方式有種,主要有三種。分別爲:文件存儲,SharedPreference存儲,以及數據庫存儲。
這篇主要講SharedPreference存儲。
1.基本據介紹
SharedPreference是使用鍵值對來存儲的。當保存數的時候需要提供一個對應的建,裝在讀取的時候就可以把對應的值取處來了。同時還支持多種不同的數據類型存儲,如果存儲的數據類型是整型,那麼取出來的也是整型。
Android中一共提供了3中方法用於得到SharedPreference對象。
1.1、Context類中的getSharedPreferences(String name, @PreferencesMode int mode)方法
name:指定名稱
路徑:data/data/包名/shared_prefs/文件名
mode:
MODE_PRIVATE, 只有當前應用纔可以打開這個。
MODE_WORLD_READABLE, 4.2被廢除
MODE_WORLD_WRITEABLE, 4.2被廢除
MODE_MULTI_PROCESS,6.0被廢除
1.2、Activity中 getPreferences(@Context.PreferencesMode int mode)
mode:MODE_PRIVATE
這個和Context類中的getSharedPreferences基本一致只不過是只需要添加mode,因爲name是默認的activity類名作爲文件名
1.3、PreferenceManager中的getDefaultSharedPreferences(Context context)
他是一個靜態方法,接收一個Context參數,自動使用當前應用程序的包作爲前綴來命名文件。得到SharedPreferences對象後就可以存儲數據了。具體分三步:
第一步:調用SharedPreferences對象的edit()方法或獲取一個SharedPreferences.Editor對象
第二步:向SharedPreferences.Editor對象中添加數據
第三步:調用aplay方法將添加的數據提交,完成數據存儲。
2.舉例說明:
保存:
//data/data/包名/shared prefs/文件名
SharedPreferences.Editor data = getSharedPreferences("data", MODE_PRIVATE).edit();
data.putString("name", "李明");
data.putInt("age", 10);
data.putBoolean("married", false);
data.apply();
SharedPreferences defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
SharedPreferences.Editor edit = defaultSharedPreferences.edit();
獲取:
SharedPreferences data = getSharedPreferences("data", MODE_PRIVATE);
String name = data.getString("name", "");
int age = data.getInt("age", 0);
boolean married = data.getBoolean("married", true);
tv.setText("name:" + name + '\n' +
"age:" + age + '\n' +
"married:" + married + '\n'
);
找到的他導出:
3.補充 SPUtils
public class SPUtils {
/**
* 保存在手機裏面的文件名
*/
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();
}
}
}
轉發表明出處:https://blog.csdn.net/qq_35698774/article/details/106669945
android互助羣:
感謝:郭霖的《第一行代碼 第二版》
工具類感謝:https://blog.csdn.net/lmj623565791/article/details/38965311