【问题标题】:SharedPreferences deleted after DataStore migration在 DataStore 迁移后删除 SharedPreferences
【发布时间】:2021-11-18 01:55:13
【问题描述】:

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

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

【问题讨论】:

    标签: android android-jetpack-datastore


    【解决方案1】:

    如果您要将单个 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()
    }
    

    请注意,迁移将删除所有已迁移的密钥,或者如果未提供任何密钥,请在编辑器上调用 clear(),这将删除所有密钥。然后,如果所有键都被删除,它将删除文件。

    解决此问题的方法是简单地为SharedPreferencesMigration 提供一组键,它作为可选参数提供。

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

    【讨论】:

      猜你喜欢
      • 2021-11-09
      • 2013-10-10
      • 2017-07-24
      • 2019-08-09
      • 2014-08-23
      • 2021-12-26
      • 2016-04-02
      • 2021-06-09
      • 2017-09-03
      相关资源
      最近更新 更多