何ですか、この動きは。
「Preference から Set を取得後、追加して再保存する」
問題なく以下のようなテストも通過します。
@Test fun getStringSet() {
val key = "key"
val preferences = context.getSharedPreferences(key, Context.MODE_PRIVATE)
val beforeData = preferences.getStringSet(key, mutableSetOf())
val beforeSize = beforeData.size
beforeData.add(System.currentTimeMillis().toString())
preferences.edit()
.putStringSet(key, beforeData)
.commit()
val afterData = preferences.getStringSet(key, mutableSetOf())
val afterSize = afterData.size
println("$beforeData -> $afterData")
println("$beforeSize -> $afterSize")
assertEquals(beforeSize + 1, afterSize)
}
I/System.out: [1520865219872, 1520865358333] -> [1520865219872, 1520865358333]
I/System.out: 1 -> 2
しかし、何回実行してもデータが1つのままで増えていきません。
I/System.out: [1520865219872, 1520865504185] -> [1520865219872, 1520865504185]
I/System.out: 1 -> 2
I/System.out: [1520865219872, 1520865553254] -> [1520865219872, 1520865553254]
I/System.out: 1 -> 2
実際にファイルを確認してみると、
mako:/data/data/com.example.cryptocurrency/shared_prefs # cat key.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<set name="key">
<string>1520865219872</string>
</set>
</map>
1つしか保存されてないですね!
クソですね!
なぜなのか?
android - Misbehavior when trying to store a string set using SharedPreferences - Stack Overflow
Android compares the modified HashSet that you are trying to save using SharedPreferences.Editor.putStringSet with the current one stored on the SharedPreference, and both are the same object!!!
A possible solution is to make a copy of the Set
returned by the SharedPreferences object
どうやら、同じオブジェクトの比較となるので保存してくれないようです。
読み出し後、すぐコピーすればいいのですね!
val beforeData = preferences.getStringSet(key, mutableSetOf()).toMutableSet()
なんとなく、よくある話のような気がします。