0

SharedPreferencesに配列を格納することについての素晴らしいチュートリアルを見つけました。配列に1つの項目を追加するたびに、それをSharedPreferencesに格納しますが、配列をロードすると、すべての値がnullになります。配列のサイズは毎回1ずつ増加しますが、要素はnullとして格納されます。なんで?

String tname[] = new String[loadArray(t_name, this).length + 1];
for (int i=0; i<tname.length; i++)
{
    Log.i("tname[" + i + "]", tname[i] + "");  //null
}
tname[tname.length-1] = et_name;  //this is a string which is not null
saveArray(tname, t_name, NewSchedule.this);

public boolean saveArray(String[] array, String arrayName, Context mContext) {   
        SharedPreferences prefs = mContext.getSharedPreferences("sp_name", 0);  
        SharedPreferences.Editor editor = prefs.edit();  
        editor.putInt(arrayName +"_size", array.length);  
        for(int i=0;i<array.length;i++)  
            editor.putString(arrayName + "_" + i, array[i]);  
        return editor.commit();  
    } 

    public String[] loadArray(String arrayName, Context mContext) {  
        SharedPreferences prefs = mContext.getSharedPreferences("sp_name", 0);  
        int size = prefs.getInt(arrayName + "_size", 0);  
        String array[] = new String[size];  
        for(int i=0;i<size;i++)  
            array[i] = prefs.getString(arrayName + "_" + i, null);  
        return array;  
    }  

見つかったコードを正しい方法で使用していますか?

* * 10代の回答に基づく解決策:

String tname[] = new String[loadArray(t_name, this).length + 1];
String[] prevPrefs = loadArray(t_name, this);
for(int i=0; i<prevPrefs.length; i++) {
   tname[i] = prevPrefs[i];  //0th element will be null, as well as e.g. the 4th when there are 3 elements
}
for (int i=0; i<tname.length; i++)
{
    if (tname[i] == null) {  //so we put the new value in place of the null
        tname[i] = et_name;
    }
}

//Arraylists are much handier than arrays
if (arr_names.size() > 0) arr_names.clear(); //first clear all elements
for (int i=0; i<tname.length; i++) {
   if (tname[i] != null) arr_names.add(tname[i]);
}
for (int i=0; i<arr_names.size(); i++) {
    if (arr_names.get(i) == null) {
        arr_names.remove(i);
        }
}

String[] tname2 = new String[arr_names.size()]; //create new array
for (int i=0; i<tname2.length; i++)  //popluate new array
{
    tname2[i] = arr_names.get(i);
}

saveArray(tname2, t_name, NewSchedule.this);
4

2 に答える 2

1

問題はここにあります:

String tname[] = new String[loadArray(t_name, this).length + 1];

この行は、値で埋められた配列を作成しませんloadArray(t_name, this).length + 1。実際には数値を返します。これはすべて、実際には次のように翻訳されます。

String tname[]= new String[5];

これは、実際にはnull値を持つ文字列の新しい配列を作成します。

prevPrefs[]解決策:次に、自分のメソッドからロードされた一時的なアイテムを繰り返し処理し、次のようloadArray()に追加する必要があります。tname[]

String[] prevPrefs = loadArray(t_name, this);
for(int i=0; i<prevPrefs.length; i++) {
   tname[i] = prevPrefs[i];
}

次に、前の配列の値で配列を埋め、最後の空のスポットに、すでに行ったように新しい値を追加できます。

于 2012-10-04T20:22:25.753 に答える
0

この行は絶対に間違っています:

String tname[] = new String[loadArray(t_name, this).length + 1];

この行は、->設定から配列をロードし、その直後に新しいメモリをtnameに割り当てます。

したがって、tnameメンバーでは常にnullになります。

プリファレンスから配列自体をロードする前に配列サイズを取得し、(サイズに応じて)配列を作成してから、プリファレンスから配列文字列をコピーする必要があります。

<<<<<編集>>>>>>

    String tname[] = loadArray(t_name, this); // only load the array, don't need "new String[]"

    for (int i=0; i<tname.length; i++)
    {
        Log.i("tname[" + i + "]", tname[i] + "");  //null
    }

    tname[tname.length-1] = et_name;  //this is a string which is not null
    saveArray(tname, t_name, MainActivity.this);

  public String[] loadArray(String arrayName, Context mContext)
  {
    SharedPreferences prefs = mContext.getSharedPreferences("sp_name", 0);
    int size = prefs.getInt(arrayName + "_size", 0);
    String array[] = new String[size + 1]; // +1 for storing the next value that should be saved
    for (int i = 0; i < size; i++)
        array[i] = prefs.getString(arrayName + "_" + i, null);
    return array;
  }
于 2012-10-04T20:09:17.207 に答える