SharedPreferencesを使用して文字列セットを保存しようとしたときの誤動作
質問
私は、文字列のセットを
SharedPreferences
API
.
Set<String> s = sharedPrefs.getStringSet("key", new HashSet<String>());
s.add(new_element);
SharedPreferences.Editor editor = sharedPrefs.edit();
editor.putStringSet(s);
edit.commit()
最初に上のコードを実行すると
s
はデフォルトの値に設定されます (作成されたばかりの空の末尾の
HashSet
に設定され、問題なく保存されます。
このコードを2回目、3回目に実行したときは
s
オブジェクトが返され、最初の要素が追加されます。要素を追加することができ、プログラムの実行中に、どうやらその要素が
SharedPreferences
に格納されるが、プログラムが終了すると
SharedPreferences
はその永続的なストレージから再び読み込まれ、新しい値は失われます。
2番目、そしてそれ以降の要素はどのように保存すれば失われないのでしょうか?
どのように解決するのですか?
この問題は、以下のサイトで説明されています。
SharedPreferences.getStringSet
.
は
SharedPreferences.getStringSet
は、保存されたHashSetオブジェクトの参照を返します。
の内部で
SharedPreferences
. このオブジェクトに要素を追加すると、実際には
SharedPreferences
.
それはいいのですが、問題は保存しようとしたときです。Android は、保存しようとしている変更された HashSet を
SharedPreferences.Editor.putStringSet
を使って保存しようとしている変更後のハッシュセットと
SharedPreference
に格納された現在のものと、両方が同じオブジェクトです!!!
可能な解決策は、コピーされた
Set<String>
が返す
SharedPreferences
オブジェクトによって返されます。
Set<String> s = new HashSet<String>(sharedPrefs.getStringSet("key", new HashSet<String>()));
これは
s
に追加された文字列は別のオブジェクトとなり
s
の中に格納されているセットには追加されません。
SharedPreferences
.
他にうまくいく回避策は、同じように
SharedPreferences.Editor
トランザクションを使用して、より単純なプリファレンス (整数やブール値など) を保存することです。必要なことは、保存された値がトランザクションごとに異なることを強制することだけです (たとえば、文字列のセットサイズを保存することができます)。
関連
-
[解決済み] AndroidでSQLiteを使用する際に、並行処理の問題を回避するにはどうすればよいですか?
-
[解決済み】AndroidでSharedPreferencesにオブジェクトを保存/格納するにはどうすればいいですか?
-
[解決済み] RecyclerView.Stateを使って、RecyclerViewのスクロール位置を保存するには?
-
[解決済み] AndroidにおけるViewPager2の適切な実装
-
[解決済み] Nexus 4でUSBデバッグモードを見つける方法とオンにする方法
-
[解決済み] ViewPagerのアイテムを強制的に再インスタンス化する方法 [重複].
-
[解決済み] アプリ内課金テスト:android.test.purchased already owned
-
[解決済み] データベースでリサイクルビューを使用する
-
[解決済み] 文字サイズとアンドロイドの画面サイズの違い
-
[解決済み] キャンバスに複数行のテキストを描画する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] SDカードからファイルを削除する方法を教えてください。
-
[解決済み] BottomSheetDialogFragmentの状態をexpandedに設定する。
-
[解決済み] Android Navigation Architecture Component - 現在表示されているフラグメントを取得する
-
[解決済み] データベースでリサイクルビューを使用する
-
[解決済み] TabLayoutに対応したandroidデザインでタブテキストのフォントを変更する
-
[解決済み] Androidのadb logcatでTAG名で特定のメッセージを除外する方法は?
-
[解決済み] 非ActivityクラスでContextを取得する [重複].
-
[解決済み] RecyclerViewのアイテムに波及効果を追加する
-
[解決済み] ブルートゥースアプリケーションのテストにアンドロイドエミュレータを使用するには?
-
[解決済み] 文字列リソースにHTML?