Общие ссылки, удаленные после переноса хранилища данных

#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")
)