【问题标题】: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);

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

【问题讨论】:

    标签: android sqlite arraylist android-sqlite android-cursor


    【解决方案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了解一下。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-25
        • 2010-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多