2015-03-11 3 views
0

поэтому я создал метод, возвращающий ArrayList класса, который я использую в моем проекте, проблема в том, что единственный элемент, добавляемый в ArrayList, является вторым в базе данных. Я знаю это, потому что я извлек файл БД и просмотрел его, а также «c.getCount()» возвращает значение 2.Курсор не движется в первую очередь?

Итак, я знаю, что моя БД содержит 2 записи, мой Курсор получает 2 записи ... но по какой-то причине он предпочитает сосредоточиться на 2-й строке в начале после того, как я ее создал, и, таким образом, покидая цикл while, даже думал, что я вызвал c.moveToFirst();

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

Мой метод выглядит следующим образом:

public ArrayList<Kiosk> getKiosks() { 
    ArrayList<Kiosk> kioskArrayList = new ArrayList<>(); 
    db = dbHandler.getWritableDatabase(); 

    String[] columns = {Tags.TAG_LOCAL_ID, Tags.TAG_ID_SERVER, Tags.TAG_NAME, 
         Tags.TAG_PHONE_NUMBER, Tags.TAG_CONTACT_NAME, Tags.TAG_SCHOOL_ID}; 
    Cursor c = db.query(DatabaseHandler.TABLE_KIOSK, columns, null, null, null, null, null); 
    c.moveToFirst(); 

    Log.i("tagg", "Size of the cursor is: " + c.getCount()); 

    while (c.moveToNext()) { 
     Kiosk kiosk = new Kiosk(); 
     kiosk.setLOCAL_ID(c.getInt(c.getColumnIndex(Tags.TAG_LOCAL_ID))); 
     kiosk.setIdServer(c.getInt(c.getColumnIndex(Tags.TAG_ID_SERVER))); 
     kiosk.setName(c.getString(c.getColumnIndex(Tags.TAG_NAME))); 
     kiosk.setPhoneNumber(c.getString(c.getColumnIndex(Tags.TAG_PHONE_NUMBER))); 
     kiosk.setContactName(c.getString(c.getColumnIndex(Tags.TAG_CONTACT_NAME))); 
     kiosk.setSchoolId(c.getInt(c.getColumnIndex(Tags.TAG_SCHOOL_ID))); 
     c.moveToNext(); 
     kioskArrayList.add(kiosk); 
     Log.w("taggg", "Added this to the kiosk Array: " + kiosk.getName() + 
       "Local ID: " + kiosk.getLOCAL_ID()); 

    } 
    Log.w("tagg", "getKioskhere, size of the array I sent is: " + kioskArrayList.size()); 

    c.close(); 
    db.close(); 
    return kioskArrayList; 
}   

Мой журнал дает ясно говорит, размер курсора составляет 2, но ArrayList является 1:

 03-11 14:18:37.334: W/(18369): School id of the client is: 1 
    03-11 14:18:37.336: I/(18369): Size of the cursor is: 2 
    03-11 14:18:37.336: W/(18369): Added this to the kiosk Array: PitaKioskLocal ID: 2 
    03-11 14:18:37.336: W/(18369): getKioskhere, size of the array I sent is: 1 

Любые советы? заблаговременно

+0

Вы вызываете 'moveToFirst()', а затем 'moveToNext()' на курсор перед выполнением любой обработки. Итак, вы начинаете со второй записи. – jas

ответ

1

Вы первый шаг к первому элементу:

c.moveToFirst(); 

Затем перейти ко второму, прежде чем вы даже обработан первый один:

while (c.moveToNext()) { 

Наконец, вы вызываете

c.moveToNext(); 

в вашей while, что приводит к игнорированию каждой второй записи.

Решение: удалите вызов внутри цикла и обработайте первый элемент, прежде чем переходить ко второму. Самый простой способ - изменить while(){} на do{} while().

+0

По какой-то причине я думал, что я вызываю moveToNext() только для своего логического значения, я не знаю, почему я думал, что на самом деле он не переместит курсор ... Спасибо миллион! – shaqed

0

Задайте порядок сортировки для запроса. Вы также выполняете moveToNext() перед любой работой.

Cursor c = db.query(DatabaseHandler.TABLE_KIOSK, columns, null, null, null, null, Tags.TAG_LOCAL_ID + " desc"); 

// stuff 
do { 

    // Iterate over cursor 

} while (c.moveToNext()); 
0

Похоже, вы звоните moveToNext() слишком много раз.

Вы начинаете с первой строки с вашего звонка moveToFirst(). Затем, когда вы входите в свою петлю while, moveToNext() вызывается снова. Таким образом, когда вы вводите свой цикл, вы уже сидите во второй строке. Затем, внутри цикла, вы вызываете moveToNext() и добавляете свой kiosk тоже kioskArrayList.

Когда вы попали в верхней части while петли во второй раз, вы сидите с индексом 2, поэтому c.moveToNext() вычисляет false, так что вы только добавить в список один раз.

Смежные вопросы