Как я могу ссылаться на элемент курсора в цикле for или while? - PullRequest
0 голосов
/ 28 августа 2010

Я пытаюсь перебрать значения в базе данных, создавая вкладки.Я настроил метод с именем createTab, который принимает значение Long и значение String.Он работает со статическими данными, но я изо всех сил пытаюсь понять, как перебирать записи базы данных SQLite.

Вот моя неудачная попытка (замените [lessthan] на символ меньше):


for (int i = 0; i [lessthan] mCursor.getCount(); i++)
{
 createTab(
  mCursor.getLong(mCursor.getColumnIndexOrThrow("_id")),
  mCursor.getString(mCursor.getColumnIndexOrThrow("category")));
}

Возможно, вам не нужен LogCat, чтобы знать, что я сделал неправильно в приведенном выше коде, но на всякий случай ...

08-27 21:28:18.268: ERROR/AndroidRuntime(232): Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 3
08-27 21:28:18.268: ERROR/AndroidRuntime(232):     at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
08-27 21:28:18.268: ERROR/AndroidRuntime(232):     at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:172)
08-27 21:28:18.268: ERROR/AndroidRuntime(232):     at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:99)
08-27 21:28:18.268: ERROR/AndroidRuntime(232):     at com.toBuy.Main.createTabs(Main.java:51)
08-27 21:28:18.268: ERROR/AndroidRuntime(232):     at com.toBuy.Main.onCreate(Main.java:38)
08-27 21:28:18.268: ERROR/AndroidRuntime(232):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
08-27 21:28:18.268: ERROR/AndroidRuntime(232):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
08-27 21:28:18.268: ERROR/AndroidRuntime(232):     ... 11 more
08-27 21:28:18.278: INFO/Process(54): Sending signal. PID: 232 SIG: 3
08-27 21:28:18.278: INFO/dalvikvm(232): threadid=7: reacting to signal 3
08-27 21:28:18.338: INFO/dalvikvm(232): Wrote stack trace to '/data/anr/traces.txt'
08-27 21:28:18.508: INFO/ARMAssembler(54): generated scanline__00000077:03515104_00000000_00000000 [ 27 ipp] (41 ins) at [0x285a68:0x285b0c] in 713498 ns
08-27 21:28:18.518: INFO/ARMAssembler(54): generated scanline__00000077:03515104_00001001_00000000 [ 64 ipp] (84 ins) at [0x285b10:0x285c60] in 1897448 ns
08-27 21:28:28.086: WARN/ActivityManager(54): Launch timeout has expired, giving up wake lock!
08-27 21:28:28.097: WARN/ActivityManager(54): Activity idle timeout for HistoryRecord{4390bf70 com.toBuy/.Main}

Спасибо за вашу помощь.

Ответы [ 3 ]

1 голос
/ 09 февраля 2017

В моем коде я получаю значение из базы данных SQLite и сохраняю это значение в массиве объекта модели Class (FriendData - это мой класс модели), используя Cursor.

   Cursor cursor = friendAdapter.fetchData(); //call method for fetch data from databse and fetched data is stored into cursor
    int cursorSize = cursor.getCount();

    if (cursor != null && cursor.moveToFirst()) {
         FriendData[] friendData=new FriendData[cursorSize];  //create array of objects as size of cursor

            for (int i = 0; i < cursorSize; i++) {
                   friendData[i]=new FriendData();

                  /*store fetched data in some variables. In my code I have store value of cursor in friendName String variable*/
                  friendName = cursor.getString(cursor.getColumnIndex(FriendAdapter.FRIEND_NM));

                 /* set friendName variable value in array of object*/
                 friendData[i].setFriendName(friendName);

              cursor.moveToNext();  //move cursor for pointing to next fetched record
           }
     }

Во-первых, у меня есть условие проверки для курсора, если он нулевой, и переместите объект курсора для указания на первую полученную запись. Затем я вычисляю размер курсора с помощью метода getCount (). После этого цикл for используется для хранения всех данных в массиве объекта и в конце курсора указывает на следующую запись, которая извлекается.

0 голосов
/ 25 апреля 2013

Используйте следующее для цикла:

   for(mCursor.moveToFirst();!mCursor.isAfterLast();mCursor.moveToNext()){
        createTab(
  mCursor.getLong(mCursor.getColumnIndexOrThrow("_id")),
  mCursor.getString(mCursor.getColumnIndexOrThrow("category")));    
        }

Хотя цикл while будет намного проще:

while (mCursor.moveToNext()) { createTab(
  mCursor.getLong(mCursor.getColumnIndexOrThrow("_id")),
  mCursor.getString(mCursor.getColumnIndexOrThrow("category")));    

}

В обоих случаях вам не нужно вручную устанавливать начальную позицию курсора.

0 голосов
/ 28 августа 2010

Вам нужно установить курсор, прежде чем вы сможете позвонить getLong или getString. После того, как вы выполните запрос, Cursor располагается непосредственно перед первой строкой, поэтому вы должны вызывать moveToNext в цикле. Что-то вроде:

int size = mCursor.getCount();
for (int i = 0; i < size; i++) {

    // Position the cursor
    mCursor.moveToNext();

    // Fetch your data values
    long id = mCursor.getLong(mCursor.getColumnIndex("_id"));
    String cat = mCursor.getString(mCursor.getColumnIndex("category"));
}
...