SharedPreferences在数据存储迁移后被删除



我遇到了这个问题,修复方法很简单,但不明显,所以我想我会分享。

我正在将单个字段从SharedPreferences迁移到Preferences DataStore,并使用默认的SharedPreferencesMigration来这样做。每次运行迁移时,我的SharedPreferences文件都会被删除。

如果要将单个SharedPreferences首选项迁移到Preferences DataStore(或多个首选项,但不是全部),则必须SharedPreferencesMigration提供一组密钥。不这样做将导致您的SharedPreferences文件被删除。

这是迁移后运行的SharedPreferencesMigrationcleanUp()函数:

override suspend fun cleanUp() {
val sharedPrefsEditor = sharedPrefs.edit()
if (keySet == null) {
sharedPrefsEditor.clear()
} else {
keySet.forEach { key ->
sharedPrefsEditor.remove(key)
}
}
if (!sharedPrefsEditor.commit()) {
throw IOException("Unable to delete migrated keys from SharedPreferences.")
}
if (sharedPrefs.all.isEmpty() && context != null && name != null) {
deleteSharedPreferences(context, name)
}
keySet?.clear()
}

注意,迁移将删除迁移的每个键,或者如果没有提供键,则调用Editor上的clear(),这将删除所有键。然后,如果所有的密钥都被删除,它将删除文件。

解决这个问题的方法就是为SharedPreferencesMigration提供一组键,作为可选参数提供。

SharedPreferencesMigration(
context = context,
sharedPreferencesName = "preferences file name"
keysToMigrate = setOf("your key name")
)

最新更新