SharedPreferences 僅支持基本類型(String、int、boolean 等),若需存儲列表、對象或巢狀結構,需採用序列化策略。本文對比三種主流方案,助你根據場景選型。
Set<String> (API 11+)直接存儲字符串集合,適合簡單的 ID 列表或標籤。
// 存儲
Set<String> categories = new HashSet<>(Arrays.asList("news", "sports", "tech"));
prefs.edit().putStringSet("user_categories", categories).apply();
// 讀取
Set<String> saved = prefs.getStringSet("user_categories", new HashSet<>());
缺點:不保證順序,無法存儲非字符串對象,部分舊設備實現有 Bug。
用特殊字符(如 |, ,, #)連接多值,解析時 split()。
// 存儲
String joined = TextUtils.join(",", new String[]{"item1", "item2", "item3"});
prefs.edit().putString("items", joined).apply();
// 讀取
String[] items = TextUtils.split(prefs.getString("items", ""), ",");
缺點:數據中若包含分隔符需轉義,維護成本高,不適合複雜結構。
利用 Gson、Moshi 或 Kotlinx.serialization 將對象轉為 JSON 字符串存儲,支撐任意複雜度。
// 依賴 Gson
implementation 'com.google.code.gson:gson:2.10+'
// 存儲對象列表
List<Category> list = ...;
String json = new Gson().toJson(list);
prefs.edit().putString("categories_json", json).apply();
// 讀取並反序列化
Type type = new TypeToken<List<Category>>(){}.getType();
List<Category> restored = new Gson().fromJson(prefs.getString("categories_json", "[]"), type);
優勢:類型安全、結構清晰、易擴展、跨平台兼容。
| 場景 | 推薦方案 |
|---|---|
| 簡單標籤/ID 集合,無序 | Set<String> |
| 極簡鍵值對,數據量極小 | 分隔符字符串 |
| 對象列表、巢狀結構、需查詢/修改單項 | JSON 序列化 |
此外,若數據量較大(超過 100KB)或需頻繁查詢,建議改用 Room 數據庫或 DataStore,避免阻塞主線程。