SharedPreferences → DataStore

SharedPreferences → DataStore

老写法(Java + SharedPreferences)

java 复制代码
// 写入
SharedPreferences prefs = getSharedPreferences("settings", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("token", "abc123");
editor.putInt("userId", 42);
editor.putBoolean("isLogin", true);
editor.apply();

// 读取
String token = prefs.getString("token", "");
int userId = prefs.getInt("userId", 0);
boolean isLogin = prefs.getBoolean("isLogin", false);

问题在哪里

apply() 是异步写入但无返回值,写没写成功不知道。主线程读取 getString 可能触发磁盘 IO,卡 UI。不支持存储非基本类型,存个对象要先 JSON 序列化。多进程场景下数据不可靠。

新写法(Preferences DataStore)

添加依赖:

groovy 复制代码
implementation "androidx.datastore:datastore-preferences:1.0.0"

定义 Key:

kotlin 复制代码
object SettingsKeys {
    val TOKEN = stringPreferencesKey("token")
    val USER_ID = intPreferencesKey("userId")
    val IS_LOGIN = booleanPreferencesKey("isLogin")
}

DataStore 实例:

kotlin 复制代码
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")

读写:

kotlin 复制代码
// 写入
viewModelScope.launch {
    context.dataStore.edit { preferences ->
        preferences[SettingsKeys.TOKEN] = "abc123"
        preferences[SettingsKeys.USER_ID] = 42
        preferences[SettingsKeys.IS_LOGIN] = true
    }
}

// 读取 --- Flow
viewModelScope.launch {
    context.dataStore.data.collect { preferences ->
        val token = preferences[SettingsKeys.TOKEN] ?: ""
        val userId = preferences[SettingsKeys.USER_ID] ?: 0
        val isLogin = preferences[SettingsKeys.IS_LOGIN] ?: false
    }
}

// 读取 --- 一次性
viewModelScope.launch {
    val preferences = context.dataStore.data.first()
    val token = preferences[SettingsKeys.TOKEN] ?: ""
}

一句话注意

DataStore 底层用 Protocol Buffers 序列化,数据存在 files/datastore/ 目录下,不是 XML。所有读写都用协程/Flow 完成,天然异步且主线程安全。

edit {} 的参数 preferencesMutablePreferences,和 Map 用法一样直接用 [] 赋值。同一个 edit {} 块内可以写多个 Key,会作为一个事务原子写入。

preferencesDataStore 委托属性是单例,同一个文件只能创建一个实例,多次调用返回同一个。在 Application 或顶层创建一次即可,不要在每个 Activity 里重复创建。


Java Android 老项目迁移系列,持续更新中。

相关推荐
·薯条大王7 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
YB137510 小时前
jetpack compose 副作用 SideEffect
android·kotlin
ZJH__GO10 小时前
网络编程v4pro--实现聊天室文件传输功能
java·服务器·网络·计算机网络
程序员黑豆10 小时前
Windows 系统 Java 环境变量配置全攻略:解决“不是内部或外部命令”
java·前端·ai编程
命运之光10 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
凤山老林11 小时前
Spring Boot @Async 线上实战:从默认配置到生产级线程池治理
java·spring boot·后端
CHB11 小时前
uni-app x 蒸汽模式 性能测试基准报告 Benchmark【Android版】
android·ios·uni-app
marvelyu11 小时前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库
带娃的IT创业者12 小时前
拆掉那堵墙:LibrePods 如何让 AirPods 在 Android 上重获新生
android·开源项目·airpods·librepods·生态解锁
AI人工智能+电脑小能手13 小时前
大白话说Java设计模式-04-工厂方法模式(业务实战篇)
java·设计模式·工厂方法模式·架构设计·代码解耦