我发现了一个很棒的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);
答案 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;
}