android - 尝试将 mutableListOf<String> 存储到 SharedPreferences 但无法设置默认值

标签 android arrays kotlin sharedpreferences

最终我试图在共享首选项中存储一个 Int 数组,但我知道 Kotlin 不支持它。因此,我使用此处的方法将 Int 数组转换为 String 数组:

How can I store an integer array in SharedPreferences?

我的问题是我很难为 getStringSet 方法设置一个默认值:

private fun loadIntScoreArray() {
        val prefs = getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE)
        //TODO: Load the String array
        var default = emptyList<String>()
        avgScoreArrayString = prefs.getStringSet(AVG_SCORE_ARRAY, default)
    }

但是 default 不是 prefs.getStringSet(AVG_SCORE_ARRAY, default) 行中可接受的对象。该错误令人困惑,因为它看起来自相矛盾:

必需:MutableList

找到:(可变)集合!

必需:(可变)设置!

找到:MutableList

最佳答案

您需要知道的事情很少。从 API 11 开始,您只能将普通对象或集合存储到共享首选项。您可以将您的列表转换为集合,但它可能是有损转换,因为您的列表中包含重复项。

如果你想使用集合,你应该这样调用它:

//to get
prefs.getStringSet(AVG_SCORE_ARRAY, emptySet<String>()))
//to set
prefs.edit().putStringSet(key, AVG_SCORE_ARRAY)

另一种方法是使用连接操作将数组连接到单个字符串。这是给你的文档https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/join-to.html

说实话,这两种方式都不是完美的解决方案。如果它是生产应用程序,我建议使用持久性库,如 Room、Realm 等。 希望对您有所帮助。

编辑。 如果你百分百确定你将存储 5 个整数(并且它在不久或遥远的将来都不会改变),那么使用数据库可能有点矫枉过正。我建议使用连接到单个字符串并将其存储为单个字符串或仅存储 5 个独立的 int 值。没有必要将简单的事情复杂化。

关于android - 尝试将 mutableListOf<String> 存储到 SharedPreferences 但无法设置默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58635608/

相关文章:

maven - Javalin 教程产生 "Unresolved reference: AtomicInteger"

Android MediaController 与视频状态同步

android - ContentResolver.insert() 返回 null,没有异常

javascript - JSLint:意外的 'for' 。意外的 'var'

c - 邻接表,分割一个数组并在c中搜索该数组中的单词

c++ - "Run-Time Check Error #2 - Stack around the variable "arr "was corrupted"当我使用一个有很多数字的文件时

android - 将 onclick 方法更改为带有动画的大小

java - Android 如何修剪字符串中的多行?

android - 是什么导致 Google AdMob 泄露 ServiceConnection?

android - textview 的 selectableItemBackgroundBorderless