首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android SharedPreferences 存儲字符串集合的正確姿勢

     編輯:程式設計綜合問答

需求場景

需要持久化保存多個名字字符串,支持增刪改查,適用於「最近搜索」、「標籤歷史」等場景。

核心 API:getStringSet / putStringSet

Android API Level 11+ (Honeycomb) 引入 Set<String> 支持,不再需要手動拼接分隔符。

完整實現代碼

1. 保存名字集合

public void saveNames(Context context, Set<String> names) {
    SharedPreferences sp = context.getSharedPreferences("name_prefs", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit();
    editor.putStringSet("saved_names", names); // 直接存 Set
    editor.apply(); // 異步提交,不阻塞主線程
}

2. 讀取名字集合

public Set<String> loadNames(Context context) {
    SharedPreferences sp = context.getSharedPreferences("name_prefs", Context.MODE_PRIVATE);
    // 返回不可修改的 Set,需拷貝後操作
    return new HashSet<>(sp.getStringSet("saved_names", new HashSet<>()));
}

3. 添加單個名字

public void addName(Context context, String name) {
    Set<String> names = loadNames(context);
    names.add(name);
    saveNames(context, names);
}

4. 刪除單個名字

public void removeName(Context context, String name) {
    Set<String> names = loadNames(context);
    names.remove(name);
    saveNames(context, names);
}

關鍵注意點(避坑指南)

陷阱說明正確做法
直接修改 getStringSet 返回的 Set返回的是不可修改的集合,調用 add/remove 會拋 UnsupportedOperationException先拷貝:new HashSet<>(sp.getStringSet(...))
使用 MODE_APPEND該模式用於文件追加寫入,不適用於 SharedPreferences使用 MODE_PRIVATE (默認)
忘記 apply()/commit()Editor 操作必須提交才生效優先用 apply() 異步寫入
存儲 null 值putStringSet 不接受 null傳空集合 new HashSet<>()

進階:封裝為工具類

public class NamePrefs {
    private static final String PREFS_NAME = "name_prefs";
    private static final String KEY_NAMES = "saved_names";
    private final SharedPreferences sp;

    public NamePrefs(Context context) {
        sp = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
    }

    public Set<String> getAll() {
        return new HashSet<>(sp.getStringSet(KEY_NAMES, Collections.emptySet()));
    }

    public void add(String name) {
        Set<String> set = getAll();
        set.add(name);
        sp.edit().putStringSet(KEY_NAMES, set).apply();
    }

    public void remove(String name) {
        Set<String> set = getAll();
        set.remove(name);
        sp.edit().putStringSet(KEY_NAMES, set).apply();
    }

    public void clear() {
        sp.edit().remove(KEY_NAMES).apply();
    }
}

適用性評估

  • ✅ 數據量小(< 1000 條)、結構簡單、頻繁讀寫
  • ❌ 數據量大、需查詢/排序、多進程共享 → 改用 Room/SQLite

掌握 getStringSet/putStringSet,輕鬆實現字符串集合持久化,告別手動拼接分隔符的繁瑣與易錯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved