1. ホーム
  2. アンドロイド

[解決済み】SharedPreferencesにArrayListを保存する。

2022-03-25 19:14:51

質問

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

どのように解決するのですか?

API 11以降では SharedPreferences EditorSets . リストを HashSet などに保存しておくとよいでしょう。読み返すときは、それを ArrayList 必要であればソートすればOKです。

//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 . 以下はその解決策です。

EDITです。

OK、以下は保存するための解決策です。 ArrayList をシリアル化したオブジェクトとして SharedPreferences を作成し、SharedPreferencesから読み込む。

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

において addTask() TaskManagerApplication クラスのメソッドで、共有環境設定のインスタンスを取得し、シリアル化された ArrayList を、TaskManagerApplication クラスの putString() メソッドを使用します。

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();
  }
}

を取得することができます。 ObjectSerializer クラスは Apache Pig プロジェクトから オブジェクトシリアライザー.java