ArrayList を SharedPreferences に保存する 質問する

ArrayList を SharedPreferences に保存する 質問する

カスタム オブジェクトを持つ がありますArrayList。各カスタム オブジェクトには、さまざまな文字列と数値が含まれています。ユーザーがアクティビティを離れて後で戻ってきた場合でも、配列を保持する必要がありますが、アプリケーションが完全に閉じられた後は配列を利用できる必要はありません。 を使用して他の多くのオブジェクトをこの方法で保存していますSharedPreferencesが、配列全体をこの方法で保存する方法がわかりません。これは可能ですか? おそらく、SharedPreferencesこれを行う方法はないのでしょうか? もっと簡単な方法はありますか?

ベストアンサー1

API 11 以降では、SharedPreferences Editorは を受け入れますSets。List を または類似のものに変換してHashSet、そのように保存できます。それを読み戻すときに、 に変換しArrayList、必要に応じて並べ替えれば、準備完了です。

//Retrieve the values
Set<String> set = myScores.getStringSet("key", null);

//Set the values
Set<String> set = new HashSet<String>();
set.addAll(listOfExistingScores);
scoreEditor.putStringSet("key", set);
scoreEditor.commit();

ArrayListをシリアル化して、 に保存したり、 から読み取ったりすることもできますSharedPreferences。解決策は次のとおりです。

編集:以下は、シリアル化されたオブジェクトとして保存し、SharedPreferences から読み取るため
の解決策です。ArrayListSharedPreferences

API は SharedPreferences への文字列の保存と SharedPreferences からの文字列の取得のみをサポートしているため (API 11 以降はよりシンプル)、タスクのリストを含む ArrayList オブジェクトを文字列にシリアル化およびデシリアル化する必要があります。

TaskManagerApplication クラスのメソッドではaddTask()、共有設定のインスタンスを取得し、次のputString()メソッドを使用してシリアル化された ArrayList を保存する必要があります。

public void addTask(Task t) {
  if (null == currentTasks) {
    currentTasks = new ArrayList<task>();
  }
  currentTasks.add(t);
 
  // save the task list to preference
  SharedPreferences prefs = getSharedPreferences(SHARED_PREFS_FILE, Context.MODE_PRIVATE);
  Editor editor = prefs.edit();
  try {
    editor.putString(TASKS, ObjectSerializer.serialize(currentTasks));
  } catch (IOException e) {
    e.printStackTrace();
  }
  editor.commit();
}

同様に、メソッドの設定からタスクのリストを取得する必要がありますonCreate()

public void onCreate() {
  super.onCreate();
  if (null == currentTasks) {
    currentTasks = new ArrayList<task>();
  }
 
  // load tasks from preference
  SharedPreferences prefs = getSharedPreferences(SHARED_PREFS_FILE, Context.MODE_PRIVATE);
 
  try {
    currentTasks = (ArrayList<task>) ObjectSerializer.deserialize(prefs.getString(TASKS, ObjectSerializer.serialize(new ArrayList<task>())));
  } catch (IOException e) {
    e.printStackTrace();
  } catch (ClassNotFoundException e) {
    e.printStackTrace();
  }
}

ObjectSerializerApache Pigプロジェクトからクラスを入手できますオブジェクトシリアライザー.java

おすすめ記事