Итерация по строкам из Sqlite-запроса

51

У меня есть таблица, которую я хочу заполнить результатом запроса базы данных. Я использую select all, и запрос возвращает четыре строки данных.

Я использую этот код для заполнения текстовых просмотров внутри строк таблицы.

Cursor c = null;
        c = dh.getAlternative2();
        startManagingCursor(c);
        // the desired columns to be bound
        String[] columns = new String[] {DataHelper.KEY_ALT};
        // the XML defined views which the data will be bound to
        int[] to = new int[] { R.id.name_entry};

         SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, 
                 R.layout.list_example_entry, c, columns, to);
         this.setListAdapter(mAdapter);

Я хочу иметь возможность разделить четыре разных значения KEY_ALT и выбрать, куда они идут. Я хочу, чтобы они заполнили четыре разных текстовых изображения вместо одного в моем примере выше. Как я могу перебирать полученный курсор?

С уважением, AK

Теги:
cursor

7 ответов

77
Лучший ответ

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

String array[] = new String[cursor.getCount()];
i = 0;

cursor.moveToFirst();
while (!cursor.isAfterLast()) {
    array[i] = cursor.getString(0);
    i++;
    cursor.moveToNext();
}
  • 0
    Это имеет смысл, но я не понимаю, как мне это использовать. Должен ли я по-прежнему использовать ListAdapter? Где я могу указать текстовые представления, к которым должно обращаться каждое значение?
  • 0
    Я заработал, пропустив ListAdapter и используя mTv4.setText (ids [3]); указать значение каждого текстового представления. Большое спасибо!
Показать ещё 4 комментария
106

Cursor объекты, возвращаемые запросами базы данных, помещаются до первой записи, поэтому итерацию можно упростить до:

while (cursor.moveToNext()) {
    // Extract data.
}

Ссылка из SQLiteDatabase.

  • 5
    +1 за предельную простоту!
  • 5
    +1 Также cursor.moveToPosition(-1) будет иметь дело с общими курсорами.
Показать ещё 3 комментария
30
for (boolean hasItem = cursor.moveToFirst(); hasItem; hasItem = cursor.moveToNext()) {
    // use cursor to work with current item
}
19

Итерацию можно выполнить следующим образом:

Cursor cur = sampleDB.rawQuery("SELECT * FROM " + Constants.TABLE_NAME, null);
ArrayList temp = new ArrayList();
if (cur != null) {
    if (cur.moveToFirst()) {
        do {
            temp.add(cur.getString(cur.getColumnIndex("Title"))); // "Title" is the field name(column) of the Table                 
        } while (cur.moveToNext());
    }
}
  • 0
    Я почти уверен, что ваша строка if (cur = null) была не тем, что вы хотели написать ... Я думаю, что это должно быть, if (cur != null) вместо этого if (cur != null) . Также вы создаете экземпляр (и, следовательно, перезаписываете) temp перед тем, как add вещи.
  • 0
    Спасибо tobesen за указание !!!!!!!!
Показать ещё 3 комментария
3

Нашел очень простой способ перебора курсора

for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()){


    // access the curosr
    DatabaseUtils.dumpCurrentRowToString(cursor);
    final long id = cursor.getLong(cursor.getColumnIndex(BaseColumns._ID));


}
3

Я согласен с chiranjib, мой код выглядит следующим образом:

if(cursor != null && cursor.getCount() > 0){
  cursor.moveToFirst();
  do{
    //do logic with cursor.
  }while(cursor.moveToNext());
}
0
public void SQLfunction() {
    SQLiteDatabase db = getReadableDatabase();
    SQLiteQueryBuilder qb = new SQLiteQueryBuilder();

    String[] sqlSelect = {"column1","column2" ...};
    String sqlTable = "TableName";
    String selection = "column1= ?"; //optional
    String[] selectionArgs = {Value}; //optional

    qb.setTables(sqlTable);
    final Cursor c = qb.query(db, sqlSelect, selection, selectionArgs, null, null, null);

   if(c !=null && c.moveToFirst()){
        do {
           //do operations
           // example : abcField.setText(c.getString(c.getColumnIndex("ColumnName")))

          }
        while (c.moveToNext());
    }


}

ПРИМЕЧАНИЕ. Чтобы использовать SQLiteQueryBuilder(), вам нужно добавить

compile 'com.readystatesoftware.sqliteasset: sqliteassethelper: +'     в вашем файле оценки

Ещё вопросы

Сообщество Overcoder
Наверх
Меню