2012-08-27 15 views
10

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

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

答えて

10

arraylistをAndroidの内部ストレージファイルとして保存することをお勧めします。例えばtext_linesという名前のArrayListのために:

内蔵ストレージファイル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(); } 

Interalストレージファイル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(); 
+0

ありがとう、これは私が使用し終わったものです、私は他の答えもうまくいくと確信しています – Peter

+1

良い、あなたのケースではsharedpreferecesで複雑なものを作るのではなく、がんばろう! – Ali

+1

これは機能しますが、共有設定はアプリのアンインストールまで永続するという特有の特性を持っていますが、SDカードストレージを使用している場合は明示的にファイルを削除する必要があります。 –

3

における方法、putStringSet()があるが、 SharedPreferences.Editorです。これは、文字列がSetの場合に利用できます。 (つまり、重複はありません)。

3

あなたは)あなたが(/ getStringSetを入れて使用しカント(レベル8のような)APIを使用している場合、これは可能な解決策ですが、あなたは大きな保存したい場合は、これはと柔軟ではない、非常に高価ですリスト。私は、単純な配列のような構造のためのデータ構造のようなマップを作成することは、事前の実行が重要であるならば、大きなオーバーヘッドを作り出すことを意味します。

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

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

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

がそれを取得するには:

は、それを保存するには

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を使用することを検討してください。あなたはカンマが含まれていないArrayListであなたのString秒を保証することができる場合、あなたは、単に

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, ",")); 

リストに読み取るために

+1

あなたのコードを使用していますが、このコードのためにヌル値を取得しています:data.add(prefs.getString(prefix + "_" + i、null)); –

24

デバイス。バックグラウンドスレッドを使用して共有プリファレンスを読み書きすることをお勧めします。

+0

ニースアプローチ、シンプル。 –

+0

シリアライズとは何ですか? –

+0

Arrays.asListには、何かを追加しようとするとUnsupportedOperationをスローする固定サイズのArrayListがあります。新しいArrayList(Arrays.asList(TextUtils.split(serialized、 "、")))のように変更できます。 – Nikola

関連する問題