将Android Cursor转换为数组的ArrayList

3
我试图将我的Cursor数据转换为一个arraylist<String[]>。但最终,arraylist中的所有数据都被最后一行覆盖了。我做错了什么?
Cursor c = myDbHelper.getLvl1Cata();
String[] data = new String[3];
c.moveToFirst();
while(!c.isAfterLast()) {
    data[0] = Integer.toString(c.getInt(0));
    data[1] = c.getString(1);
    data[2] = Integer.toString(c.getInt(2));
    Log.e("cc", data[1]);
    catalogueData.add(data);
    c.moveToNext();
}   
3个回答

12

试试这个

Cursor c = myDbHelper.getLvl1Cata();
String[] data;
if (c != null) {
    while(c.moveToNext()) {
        data = new String[3]; // Note this addition
        data[0] = Integer.toString(c.getInt(0));
        data[1] = c.getString(1);
        data[2] = Integer.toString(c.getInt(2));
        Log.e("cc", data[1]);
        catalogueData.add(data);
    }
    c.close();
}

data 是一个字符串数组。在原始代码中,你多次将同一个数组添加到catalogueData结构中。每次更改了数组内容的值,但仍然是同一个数组对象。因此,你最终会得到 catalogueData 持有指向单个数组的多个引用,而data[0]只能拥有一个值:最后一次更改的值。

这个答案通过为游标中的每一行使用新的和不同的数组来解决这个问题。


嗨 Waren,我也在做同样的事情,但是在catalogueData.add(data);这行代码处出现了错误,请问这是为什么呢?请你能够指导我一下吗? - Anupam
1
@Anupam,你需要告诉我错误是什么,否则我就帮不了你。 - WarrenFaith
@WarrenFaith 有没有办法一次读取光标并将其存储在数组列表中,如果我不想运行循环的话? - Shivam Agrawal
@ShivamAgrawal 不是的。游标只是指向数据的指针,你需要自己移动它。因此循环是唯一的机会。 - WarrenFaith
@Anupam catalogueData.add(data); 将数据添加到arraylist catalogueData中。catalogueData变量应该是List或ArrayList或类似的东西。 - azwar_akbar

1

试试这个:

if(mycursor!=null){    
            do{
    TextView name = (TextView)view.findViewById(R.id.contact_name);               
    name.setText(cursor.getString(cursor.getColumnIndex
                (Displayname)));
    mycursor.moveToNext();
            }while (mycursor.isLast());
        }

0
String[] data = new String[3]; 放入 while 循环中。你正在每次迭代时覆盖数组对象。

在Android中,在循环中创建新对象是不好的编程习惯!请查看我的答案,其中声明和初始化分为两步。 - WarrenFaith
@WarrenFaith:你能澄清一下在循环中创建新对象的含义吗?尽管您将变量的声明与对象的创建分开,但您的答案也会在循环中创建新对象。 - LarsH
@LarsH:他的答案与我的完全相同。声明放在哪里并不重要。如果你想保存一组数组,你必须在每次迭代时创建一个新的数组集合,否则上一个数组集合将会覆盖最后一个。 - DeeV
否则,如果您只是在每次迭代时丢弃数组,那么是的,这将是正确的。您需要在循环外创建对象。 - DeeV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接