#android #android-jetpack-datastore
Вопрос:
Я столкнулся с этим, и решение простое, но неочевидное, поэтому я решил поделиться.
Я перенес одно поле из SharedPreferences
в a Preferences DataStore
и использовал для этого значение по умолчанию SharedPreferencesMigration
. Каждый раз, когда выполнялась миграция, мой SharedPreferences
файл удалялся.
Ответ №1:
Если вы переносите одно SharedPreferences
предпочтение на a Preferences DataStore
(или несколько префиксов, но не все из них), вы должны предоставить набор ключей для SharedPreferencesMigration
. Если вы этого не сделаете, ваш SharedPreferences
файл будет удален.
Это SharedPreferencesMigration
cleanUp()
функция, которая запускается после миграции:
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() amp;amp; context != null amp;amp; name != null) {
deleteSharedPreferences(context, name)
}
keySet?.clear()
}
Обратите внимание, что при переносе будут удалены все перенесенные ключи, или, если ключи не были предоставлены, обратитесь clear()
к редактору, который удалит все ключи. Затем, если все ключи будут удалены, он удалит файл.
Исправление для этого состоит в том , чтобы просто предоставить набор ключей SharedPreferencesMigration
, которые он предоставляет в качестве дополнительного параметра.
SharedPreferencesMigration(
context = context,
sharedPreferencesName = "preferences file name"
keysToMigrate = setOf("your key name")
)