Как я могу создать список Array с курсором данных в Android - PullRequest
34 голосов
/ 30 августа 2009

Как мне создать список Array (список отображает первый алфавит при прокрутке) с данными курсора?

Ответы [ 5 ]

66 голосов
/ 31 августа 2009

Просмотрите все элементы в 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 - на индекс столбца значения, которое вы хотите получить из курсора.)

40 голосов
/ 21 июля 2011

Одна быстрая коррекция: цикл 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();
}
22 голосов
/ 20 января 2014

Даже лучше, чем ответ @ 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
}
3 голосов
/ 11 сентября 2015

Этот работал очень хорошо для меня, потому что я хотел, чтобы массив объектов:

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 и убедитесь, что у него есть конструктор.

1 голос
/ 17 июля 2018

В 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"))
}
...