37

共有設定に文字列セットを保存します。読み出せば問題ありません。私は他の活動を開始し、戻ってもう一度読みます。大丈夫です。アプリケーションを閉じて再度起動すると、セットが取得されますが、アイテムは 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 つのアイテムがまだそこにあるよりも受け入れられると思います。説明はありますか?

4

7 に答える 7

0

ドキュメントによると、SharedPreferences の文字列セットは不変として扱われるべきであり、変更しようとすると事態は悪化します。回避策は次のとおりです。既存のセットを取得し、そのコピーを作成し、コピーを更新してから、新しいセットのように共有設定に保存します。

Set<String> feedbackSet = getFeedbacksSet();
if(feedbackSet == null){
    feedbackSet = new HashSet<String>();
}

//make a copy of the set, update the copy and save the copy
Set<String> newFeedbackSet = new HashSet<String>();
JSONObject json = createJSONObjectfromFeedback(feedbackItem);
newFeedbackSet.add(json.toString());
newFeedbackSet.addAll(feedbackSet);
ed.putStringSet(CoreSetup.KEY_FEEDBACK, newFeedbackSet);
ed.commit();
于 2016-11-18T01:34:44.697 に答える
-1

文字列を共有設定に保存するには

   SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(this).edit();
   editor.putString("text", mSaved.getText().toString());
   editor.commit();

共有設定からデータを取得するには

 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
 String restoredText = prefs.getString("text", null);
于 2013-11-13T08:53:11.833 に答える