首页 > 解决方案 > Android DataStore:从 Java 调用 Context.createDataStore

问题描述

我正在尝试用 Java 实现新的类型化 DataStore API,但遇到了一些问题。所有文档似乎都只在 Kotlin 中,并且尝试创建新的数据存储并不像 Java 方面那样直接。

从 Java调用DataStoreFactoryKt.createDataStore()需要我提供所有参数,包括 Kotlin 实现中具有默认值的参数。该功能似乎没有任何@JvmOverloads注释,导致我的困境。

fun <T> Context.createDataStore(
    fileName: String,
    serializer: Serializer<T>,
    corruptionHandler: ReplaceFileCorruptionHandler<T>? = null,
    migrations: List<DataMigration<T>> = listOf(),
    scope: CoroutineScope = CoroutineScope(Dispatchers.IO + SupervisorJob())
): DataStore<T> =
    DataStoreFactory.create(
        produceFile = { File(this.filesDir, "datastore/$fileName") },
        serializer = serializer,
        corruptionHandler = corruptionHandler,
        migrations = migrations,
        scope = scope
)

如果有的话,有什么更好的方法来解决这个问题?或者 Data Store api 是否简单设计为仅与 Kotlin 一起使用?我不知道如何CoroutineScope从 Java 中提供一个论点。

标签: androidkotlin

解决方案


在将 dataStore 依赖项更新为“1.0.0-alpha08”后,如下所示。

// DataStore
implementation "androidx.datastore:datastore-preferences:1.0.0-alpha08"

您可以有如下偏好实现:

private val Context.dataStore by preferencesDataStore("app_preferences")

之后,如果您喜欢创建一些首选项键:

private object Keys {
    val HIDE_VISITED = booleanPreferencesKey("hide_visited")
}

其他选项可以是字符串PreferencesKey、int PreferencesKey 等。

保存值示例:

context.dataStore.edit { prefs -> prefs[Keys.HIDE_VISITED] = hideVisited }

读取保存值示例:

val hideVisited = preferences[Keys.HIDE_VISITED] ?: false

推荐阅读