如何在 Android 中使用光标数据创建列表数组

Posted

技术标签:

【中文标题】如何在 Android 中使用光标数据创建列表数组【英文标题】:How can I create a list Array with the cursor data in Android 【发布时间】:2010-11-24 03:37:18 【问题描述】:

如何使用光标数据创建列表数组(滚动时列表显示第一个字母)?

【问题讨论】:

你想用光标的数据创建一个ArrayList 【参考方案1】:

在 Kotlin 中你可以使用这个扩展:

fun <T> Cursor.toList(block: (Cursor) -> T) : List<T> 
    return mutableListOf<T>().also  list ->
        if (moveToFirst()) 
            do 
                list.add(block.invoke(this))
             while (moveToNext())
        
    

并使用它:

val listOfIds = cursor.toList  
    // create item from cursor. For example get id:
    it.getLong(it.getColumnIndex("_id"))

【讨论】:

【参考方案2】:

这个对我来说非常有效,因为我想要一个对象数组列表:

List<MyObject> myList = new ArrayList<String>();
Cursor c = ...

while(c.moveToNext()) 
    myList.add(new MyObject(cursor.getInt(cursor.getColumnIndex("_id")), cursor.getString(cursor.getColumnIndex("column1")), cursor.getInt(cursor.getColumnIndex("column2")));        

c.close();

只需创建一个 POJO MyObject 并确保它有一个构造函数。

【讨论】:

【参考方案3】:

比@imbrizi 的回答更好的是:

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

moveToNext() 将在没有任何剩余时返回 false,因此这会将 SLOC 减少一些,并且更易于查看。

更好的是在循环之外获取列索引。

ArrayList<String> mArrayList = new ArrayList<String>();
int columnIndex=mCursor.getColumnIndex(dbAdapter.KEY_NAME)
while(mCursor.moveToNext()) 
     mArrayList.add(mCursor.getString(columnIndex)); //add the item

【讨论】:

唯一正确的遍历游标的方法。其他两个答案只是....错误:| 除了奇怪的场景外,通常可以将getColumnIndex外部化到循环之外【参考方案4】:

一个快速修正:上面的 for 循环跳过了光标的第一个元素。 要包含第一个元素,请使用:

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

【讨论】:

非常好的点imbrizi。这是循环游标元素的更好方法 如何添加两个或多个列值??【参考方案5】:

遍历Cursor 中的每个元素,并将它们一一添加到ArrayList

ArrayList<WhateverTypeYouWant> mArrayList = new ArrayList<WhateverTypeYouWant>();
for(mCursor.moveToFirst(); !mCursor.isAfterLast(); mCursor.moveToNext()) 
    // The Cursor is now set to the right position
    mArrayList.add(mCursor.getWhateverTypeYouWant(WHATEVER_COLUMN_INDEX_YOU_WANT));

(将WhateverTypeYouWant 替换为您想要创建ArrayList 的任何类型,并将WHATEVER_COLUMN_INDEX_YOU_WANT 替换为您希望从光标中获取的值的列索引。)

【讨论】:

嗨,我想做的重要事情是在我的列表中显示“拳头字符”。从光标获取所有数据后,我不知道如何将其转换为 String[] 数组以获取“第一个字符”。它看起来像这样 char firstLetter = mString[firstVisibleItem].charAt(0); 朋友们:上面的 for 循环并不完全正确(条件和增量交换了)。使用for(mCursor.moveToFirst(); !mCursor.isAfterLast(); mCursor.moveToNext()) 这种类型的循环读起来有点难看。 @PearsonArtPhoto 的解决方案更加优雅且易于阅读。 getWhateverTypeYouWant 是什么意思?这是真正的方法吗?

以上是关于如何在 Android 中使用光标数据创建列表数组的主要内容,如果未能解决你的问题,请参考以下文章

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

如何从 Sqlite ( android ) 中的 datetime 字段获取日期

android光标未关闭错误

如何通过光标获取android中的时间戳列值?

什么时候在Android中关闭光标?

Android - 使用片段和简单的光标适配器填充列表视图