将光标数据复制到数组列表中

Posted

技术标签:

【中文标题】将光标数据复制到数组列表中【英文标题】:Copying cursor data into arraylist 【发布时间】:2016-08-31 06:38:33 【问题描述】:

我有一个查询,它在 android sqlite 中从数据库表规则中填充光标。 当我在光标上使用 getcount 时,它会显示 24,这意味着光标中有 24 行。我想要的是光标内的所有数据都应该复制到多维数组或数组列表中,或者换句话说,将数据库表的副本复制到数组列表中。

c = obj_db.rawQuery("select * from rules", null);
int count=c.getCount();
String x= String.valueOf(count);

简而言之,我想要数组列表中的表中的数据副本

【问题讨论】:

【参考方案1】:

这样做

ArrayList<String> mArrayList = new ArrayList<String>();
c.moveToFirst();
while(!c.isAfterLast()) 
     mArrayList.add(c.getString(c.getColumnIndex(dbAdapter.KEY_NAME))); //add the item
     c.moveToNext();

这里重要的一行是

mArrayList.add(c.getString(c.getColumnIndex(KEY_NAME))); 

在这里,我从位于名为 KEY_NAME 的列中的光标中获取字符串,您可以根据您的数据获取 Int 等。只需使用相应的列名即可。

编辑。

这是一个例子。您可以像这样创建行类型的自定义列表并向其中添加数据。

if (cursor != null && cursor.moveToFirst()) 
            //get columns
            int titleColumn = cursor.getColumnIndex
                    (android.provider.MediaStore.Audio.Media.TITLE);
            int idColumn = cursor.getColumnIndex
                    (android.provider.MediaStore.Audio.Media._ID);
            int artistColumn = cursor.getColumnIndex
                    (android.provider.MediaStore.Audio.Media.ARTIST);
            int albumID = cursor.getColumnIndex
                    (MediaStore.Audio.Media.ALBUM_ID);
            int albumColumn = cursor.getColumnIndex
                    (MediaStore.Audio.Media.ALBUM);
            //add row to list
            do 
                long thisId = cursor.getLong(idColumn);
                String thisTitle = cursor.getString(titleColumn);
                String thisArtist = cursor.getString(artistColumn);
                String thisAlbum = cursor.getString(albumColumn);
                String thisAlbumID = cursor.getString(albumID)
                if (thisAlarm + thisNoti + thisRing==0)
                    arrayList.add(new Row(thisId, thisTitle, thisArtist, thisAlbum, thisAlbumID));
            
            while (cursor.moveToNext());
            cursor.close();
        

【讨论】:

它将每一行复制到数组列表中还是只复制指定列中的一个字段?当我使用类似的方法时,我只能得到一列的单个字段。 我不认为你可以简单地复制整个列表而不先获取每一行。我添加了一个例子。它非常易于使用 我明天会向您更新此方法,但正如我对@Dinesh Bob 所说,当我们有更多列时,这可能是很多代码。就像我们为游标和数组列表克隆一样,游标和数组列表之间应该有任何桥梁 谢谢@varunkr 我是如何使用 som 解决它的,使用 2d 数组的实际逻辑,但是你的 cmets 对于该解决方案非常有用 @ijazkhattak 很高兴知道它有帮助,谢谢接受!!【参考方案2】:

您必须创建一个 Java 模型类。它应该包含表格所有列的字段。

然后逐行遍历游标。对于每一行,从光标中获取所有列并创建模型对象。然后将该对象添加到 ArrayList。

Java 模型类:

public class MyData 
    String column1;
    String column2;

    public MyData(String column1, String column2)
        this.column1 = column1;
        this.column2 = column2;
    

迭代光标并添加到列表中:

List<MyData> list = new ArrayList<>();

while(cursor.moveToNext()) 
    String column1 = cursor.getString(cursor.getColumnIndex(COLUMN_NAME1));
    String column2 = cursor.getString(cursor.getColumnIndex(COLUMN_NAME2));
    MyData data = new MyData(column1, column2);
    list.add(data);

更新:

如果你不想有一个Java模型类,你可以使用List of Lists。

List<List> outerList = new ArrayList<>();
List<Object> innerList = new ArrayList<>();

    while(cursor.moveToNext()) 
        String column1 = cursor.getString(cursor.getColumnIndex(COLUMN_NAME1));
        String column2 = cursor.getString(cursor.getColumnIndex(COLUMN_NAME2));
        innerList.add(column1);
        innerList.add(column2);
        outerList.add(innerList);
    

不过,我建议使用第一种利用 Java 模型类的方法。

【讨论】:

感谢您的宝贵时间,但当我们的列数有限时,这是一个不错的选择,但我可能有超过 10 列,事情可能会进入意大利面条代码。我认为可能有某种方式可以逐行访问游标。或通过像 [r1,c1] 这样的 for 循环到数组 [0,0] 等等。 @ijazkhattak 你知道spaghetti code 指的是什么吗?您似乎在使用随机流行语... 在我看来,这种类型的代码会更易读,更便于以后维护。 使用Java模型类比使用通用数组或列表更容易维护。 @ijazkhattak 我为您的用例更新了答案。在 Android 中,使用 List of Lists 比二维 List 具有更多的性能优势。【参考方案3】:

你需要循环进入光标。

类似

while (c.moveToNext()) 
    // The instruction to read the data into the cursor
    // int a = c.getString(0);

【讨论】:

【参考方案4】:

有多种方式to iterate cursor。

如果您想显示数据,请尝试SimpleCursorAdapter。

至于多维数组你可以修改SimpleCursorAdapter,在the source code了解一下。

【讨论】:

以上是关于将光标数据复制到数组列表中的主要内容,如果未能解决你的问题,请参考以下文章

如何将列表复制到数组

练习七:列表复制(将一个列表的数据复制到另一个列表中)

将一个列表的数据复制到另一个列表中

如何将列表中的元素复制到数组 c/c++

想要从 iPhone 的 plist 中的字典数组中获取数据? [复制]

如何将子列表中的数据解包到一个列表中? [复制]