将光标数据复制到数组列表中
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了解一下。
【讨论】:
以上是关于将光标数据复制到数组列表中的主要内容,如果未能解决你的问题,请参考以下文章