SharedPreferences储存取出时候没有修改重新进值又修改了

解决进程不同导致的数据共享问题:MODE_MULTI_PROCESS与存储方案,
文章探讨了由于进程差异引发的问题,并提出通过启用MODE_MULTI_PROCESS模式来解决。建议的解决方案包括使用本地txt文件、网络存储或借助sqlline的本地数据库来存储和共享数据。

这种情况大概了是因为所在进程不一样导致可以使用MODE_MULTI_PROCESS解决,解决方案使用本地文件txt储存数据或者网络储存数据或者用sqlline本地数据库储存

### 多次修改 SharedPreferences 存储的方法 在 Android 中,`SharedPreferences` 是一种用于存储轻量级键数据的机制。由于其简单易用且线程安全(在合理使用方式下),它常被用于保存用户偏好设置、应用状态等信息。当需要多次修改 `SharedPreferences` 中的时,可以通过 `SharedPreferences.Editor` 对象来实现。 #### 使用 apply() 或 commit() 方法 每次修改 `SharedPreferences` 的都需要通过 `Editor` 对象行操作,并调用 `apply()` 或 `commit()` 方法提交更改。两者的主要区别在于: - `apply()` 是异步提交,不会阻塞主线程,适合大多数场景。 - `commit()` 是同步提交,会返回布尔表示是否成功,适用于需要立即确认写入结果的情况。 例如,连续修改某个字符串和整数: ```java SharedPreferences sharedPref = getSharedPreferences("user", Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPref.edit(); // 修改字符串 editor.putString("username", "Alice"); // 修改整数 editor.putInt("age", 25); // 提交所有更改 editor.apply(); ``` 这种批量提交的方式比多次调用 `apply()` 或 `commit()` 更加高效[^1]。 #### 多线程环境下的修改 如果在多个线程中频繁修改 `SharedPreferences`,应确保使用相同的 `SharedPreferences` 实例以避免数据不一致问题。虽然 `SharedPreferences` 在内部通过 `synchronized` 锁保证了线程安全[^2],但频繁的跨线程写入仍可能引发性能问题。建议将共享数据的操作集中在一个线程内处理。 #### 修改加密的 SharedPreferences 若使用了加密的 `SharedPreferences`(如通过 `EncryptedSharedPreferences` 包装),修改的方式与普通 `SharedPreferences` 类似,但需确保在初始化 `EncryptedSharedPreferences` 时提供正确的加密密钥和加密策略。例如: ```java SharedPreferences encryptedSharedPref = EncryptedSharedPreferences.create( context, "encrypted_prefs", masterKey, EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM ); SharedPreferences.Editor editor = encryptedSharedPref.edit(); editor.putString("secure_data", "sensitive_value"); editor.apply(); ``` 这种方式支持在多次修改中保持数据的安全性[^3]。 #### 初始设定与后续修改 在首次启动应用时,可以为某些键设置默认,并在后续运行中根据业务逻辑多次修改这些。例如,在首次启动时设置初始密码,并记录修改次数: ```java SharedPreferences pref = getSharedPreferences("password", Context.MODE_PRIVATE); SharedPreferences.Editor editor = pref.edit(); int count = pref.getInt("count", 0); if (count == 0) { editor.putString("pwd", "12345678"); // 设置初始密码 } editor.putInt("count", ++count); // 每次启动都更新计数器 editor.apply(); ``` 这种方式可以确保某些关键只在特定条件下初始化一次,并允许后续任意次数的修改[^4]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值