Android SharedPreferences 文字列セット - アプリの再起動後に一部の項目が削除される 質問する

Android SharedPreferences 文字列セット - アプリの再起動後に一部の項目が削除される 質問する

共有設定に文字列セットを保存し、読み出すと問題ありません。他のアクティビティを開始し、戻って再度読み取ると、問題ありません。アプリケーションを閉じて再度起動すると、セットは取得されますが、4 つの項目ではなく 1 つの項目のみになります。これは頻繁に発生します。既知の問題はありますか? 何が間違っているのでしょうか?

クラスでは、アプリケーションの oncreate メソッドで作成される SharedPreferences 変数と SharePreferences.Editor 変数があります。これらを save メソッドと load メソッドで使用します。

public void saveFeedback(FeedbackItem feedbackItem) {
    checkSp();
    Set<String> feedbackSet = getFeedbacksSet();
    if(feedbackSet == null){
        feedbackSet = new HashSet<String>();
    }
    JSONObject json = createJSONObjectfromFeedback(feedbackItem);
    feedbackSet.add(json.toString());
    ed.putStringSet(CoreSetup.KEY_FEEDBACK, feedbackSet);
    ed.commit();
}

public Set<String> getFeedbacksSet(){
    checkSp();
    Set<String> ret = sp.getStringSet(CoreSetup.KEY_FEEDBACK, null);
    return ret;
}

private void checkSp(){
    if(this.sp == null)
        this.sp = applicationContext.getSharedPreferences(applicationContext.getPackageName(), Context.MODE_PRIVATE);
    if(this.ed == null)
        this.ed = this.sp.edit();
}

アプリの実行中にすべてのアイテムを完璧に保存しておき、再起動後にすべてのアイテムがセットに含まれないのは、どうして起こるのか理解できません。また、すべてのアイテムが削除された方が、一部のアイテムが消えて 1 つのアイテムが残っているよりも許容できると思います。説明はありますか?

ベストアンサー1

ご質問の内容から判断すると、4 つの項目がセットに追加された後にのみ commit を呼び出す必要があります。コードでは、フィードバックごとに commit を呼び出しており、以前のフィードバックが上書きされます。

アップデート:http://developer.android.com/reference/android/content/SharedPreferences.html#getStringSet(java.lang.String、java.util.Set)

Note that you must not modify the set instance returned by this call. The consistency of the stored data is not guaranteed if you do, nor is your ability to modify the instance at all.

まさにあなたがやっていることだ

おすすめ記事