SharedPreferences字符串集合移除条目重启不生效,现有方案无效
这个问题我之前也踩过坑!核心原因是SharedPreferences返回的StringSet是它内部维护的不可修改实例,你直接修改这个集合再存回去时,SP会认为集合对象引用没变化,不会触发持久化操作。
正确实现方案
你需要每次获取集合时创建一个独立的可变集合副本,修改副本后再保存这个新集合:
首先修正getAllFoodEvents方法,确保返回全新的集合实例:
fun getAllFoodEvents(): MutableSet<String> { // 用HashSet包裹SP返回的集合,创建完全独立的副本 return HashSet(sharedPrefs.getStringSet(FOOD_EVENTS_KEY, HashSet<String>())) }
然后是saveAllFoodEvents的标准实现,必须通过Editor提交修改:
fun saveAllFoodEvents(events: Set<String>) { sharedPrefs.edit() .putStringSet(FOOD_EVENTS_KEY, events) .apply() // 异步提交,适合绝大多数场景;需同步确认结果用commit() }
你的removeFoodEvent方法可以保持不变,现在它操作的是独立的集合副本:
fun removeFoodEvent(foodEvent: FoodEvent) { val events = getAllFoodEvents() events.remove(foodEvent.toString()) saveAllFoodEvents(events) }
为什么原代码无效?
SharedPreferences的getStringSet返回的是它内部缓存的集合引用,当你直接修改这个集合时,SP无法感知到内容变化(因为对象本身没换)。只有当你传入一个全新的集合对象到putStringSet时,SP才会识别到需要更新并写入磁盘。
额外注意点
- 别尝试直接修改
getStringSet返回的集合,哪怕它被标记为MutableSet——这是SP的内部对象,强行修改可能引发不可预期的异常。 apply()是异步写入,不会阻塞主线程;commit()是同步写入,会返回布尔值表示保存是否成功,仅在需要立即确认结果时使用。
内容的提问来源于stack exchange,提问作者lbenedetto
相关产品推荐
相关产品推荐

