为什么我将null作为数组元素?

时间:2012-10-04 19:30:54

标签: android sharedpreferences

我发现了一个很棒的tutorial关于在SharedPreferences中存储数组的问题。每次我向数组添加一个项目时,我都将它存储在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);

2 个答案:

答案 0 :(得分:1)

问题在于:

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

此行不会创建一个充满值的数组:loadArray(t_name, this).length + 1实际返回一个数字。所有这些实际上翻译为:

String tname[]= new String[5];

实际上创建了一个具有空值的新字符串数组。

解决方案:然后,您应该在从您的prevPrefs[]方法加载的临时loadArray()项目中进行迭代,并将其添加到tname[]中,如下所示:

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

然后你会让数组填充前一个数组的值,你可以像往常一样将新值添加到最后一个空白点。

答案 1 :(得分:0)

这一行绝对错误:

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

这一行说 - &gt;从首选项加载数组,然后加载 为tname分配新内存

因此,您将始终在tname成员中获取null。

你应该在从首选项加载数组本身之前获取数组大小,创建数组(根据大小),然后从首选项中复制数组字符串

&LT;&LT;&LT;&LT;&LT;编辑&gt;&gt;&gt;&gt;&gt;&gt;

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