2009-08-30 24 views

Odpowiedz

54

Przejrzyj wszystkie elementy w Cursor i dodaj je pojedynczo do 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)); 
} 

(zastąpić WhateverTypeYouWant z dowolnego typu chcesz dokonać ArrayList iw WHATEVER_COLUMN_INDEX_YOU_WANT z indeksu kolumny wartości chcesz dostać od kursora).

+0

Witam, Ważną rzeczą, którą chcę zrobić, jest wyświetlenie "Postaci pięści" na mojej liście. Po uzyskaniu wszystkich danych z kursora, nie wiem jak przekonwertować go na ciąg [] Array, aby uzyskać "First character". Wygląda to tak jak char firstLetter = mString [firstVisibleItem] .charAt (0); – Dennie

+8

Przyjaciele: powyższa pętla for nie jest całkowicie prawidłowa (warunek i przyrost są zamieniane). Użyj 'for (mCursor.moveToFirst();! MCursor.isAfterLast(); mCursor.moveToNext()) {}' –

+2

Ten typ pętli jest dość okropny do odczytania. Rozwiązanie z @PearsonArtPhoto jest o wiele bardziej eleganckie i łatwiejsze do odczytania. – WarrenFaith

39

jeden szybki korekty: dla pętli powyżej pomija pierwszy element kursora. Aby to pierwszy element, użyj tego:

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(); 
} 
+3

bardzo dobry punkt imbrizi. Jest to znacznie lepszy sposób na przechodzenie między elementami Cursor – DonnaLea

+0

, jak dodać dwie lub więcej wartości kolumny ?? –

20

Nawet lepiej niż na @ imbrizi odpowiedź jest taka:

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

moveToNext() zwróci false, jeśli nie ma nic w lewo, więc ta zmniejsza SLOC przez kilka, i jest łatwiej zobaczyć.

Jeszcze lepiej jest uzyskać indeks kolumny poza pętlą.

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

Jedyny poprawny sposób na iterację za pomocą kursora. Pozostałe dwie odpowiedzi są po prostu ... złe: | – iTwenty

+1

Z wyjątkiem dziwnych scenariuszy, zazwyczaj można przekazać zewnętrzną wartość getColumnIndex poza pętlę – rds

3

Ten pracował bardzo dobrze dla mnie, bo chciałem ArrayList obiektów:

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(); 

prostu zrobić POJO MyObject i upewnić się, że ma konstruktora.