11

APIレベル8ArrayListで文字列を保存するための最良の方法は何ですか?SharedPreferences私が今考えることができる唯一の方法は、すべての文字列をコンマで区切られた1つの文字列に保存し、その方法で保存することです。しかし、文字列の最大サイズがあるかどうかはわかりません。

これを行うためのより良い方法はありますか?

4

4 に答える 4

26

カンマが含まれていないことを保証できる場合は、単に次を使用できStringます。ArrayList

List<String> list = new ArrayList<String>();
...
editor.putString(PREF_KEY_STRINGS, TextUtils.join(",", list));

とリストを読む

String serialized = prefs.getString(PREF_KEY_STRINGS, null);
List<String> list = Arrays.asList(TextUtils.split(serialized, ","));

デバイスのメモリによって制限されます。バックグラウンドスレッドを使用して共有設定の読み取り/書き込みを行うことをお勧めします。

于 2012-08-27T23:40:16.187 に答える
10

アレイリストをAndroidの内部ストレージファイルとして保存することをお勧めします。たとえば、次の名前の配列リストの場合text_lines

内部ストレージファイルIO(書き込み):

try {
   //Modes: MODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITABLE
   FileOutputStream output = openFileOutput("lines.txt",MODE_WORLD_READABLE);
   DataOutputStream dout = new DataOutputStream(output);
   dout.writeInt(text_lines.size()); // Save line count
   for(String line : text_lines) // Save lines
      dout.writeUTF(line);
   dout.flush(); // Flush stream ...
   dout.close(); // ... and close.
}
catch (IOException exc) { exc.printStackTrace(); }

内部ストレージファイルIO(読み取り):

FileInputStream input = openFileInput("lines.txt"); // Open input stream
DataInputStream din = new DataInputStream(input);
int sz = din.readInt(); // Read line count
for (int i=0;i<sz;i++) { // Read lines
   String line = din.readUTF();
   text_lines.add(line);
}
din.close();
于 2012-08-27T22:46:33.763 に答える
3

文字列が。の場合に利用できるメソッドputStringSet()、、があります。(つまり、重複はありません)。SharedPreferences.EditorSet

于 2012-08-27T22:48:14.967 に答える
3

put / getStringSet()を使用できないAPI(レベル8など)を使用している場合、これは可能な解決策ですが、より大きなリストを保存する場合、これは非常に高価で柔軟性がありません。パフォーマンスが重要な場合、単純な配列のような構造のデータ構造のようなマップを作成すると、大きなオーバーヘッドが発生します。

保存するには:

public static void writeList(Context context, List<String> list, String prefix)
{
    SharedPreferences prefs = context.getSharedPreferences("YourApp", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = prefs.edit();

    int size = prefs.getInt(prefix+"_size", 0);

    // clear the previous data if exists
    for(int i=0; i<size; i++)
        editor.remove(prefix+"_"+i);

    // write the current list
    for(int i=0; i<list.size(); i++)
        editor.putString(prefix+"_"+i, list.get(i));

    editor.putInt(prefix+"_size", list.size());
    editor.commit();
}

それを取得するには:

public static List<String> readList (Context context, String prefix)
{
    SharedPreferences prefs = context.getSharedPreferences("YourApp", Context.MODE_PRIVATE);

    int size = prefs.getInt(prefix+"_size", 0);

    List<String> data = new ArrayList<String>(size);
    for(int i=0; i<size; i++)
        data.add(prefs.getString(prefix+"_"+i, null));

    return data;
}

そして実際にそれを使用するには:

List<String> animals = new ArrayList<String>();
animals.add("cat");
animals.add("bear");
animals.add("dog");

writeList(someContext, animals, "animal");

そしてそれを取得するには:

List<String> animals = readList (someContext, "animal");

SharedPreferencesの使用に制限されていない場合は、SQLiteDatabaseの使用を検討してください。

于 2012-08-27T23:07:32.983 に答える