2009-05-24 3 views
27

Я создаю приложение, и у меня проблемы с Cursor. У меня есть SQLiteDatabase, который возвращает мне Cursor, когда я пытаюсь извлечь значения с помощью этой функции:Получить значение поля с помощью курсора

public Cursor fetchOption(long rowId) throws SQLException { 

    Cursor mCursor = mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, 
     KEY_TITLE, KEY_BODY}, KEY_ROWID + "=" + rowId, null, 
     null, null, null, null); 
    if (mCursor != null) { 
     mCursor.moveToFirst(); 
    } 
    return mCursor; 

} 

Я не знаю, как получить значение поля в Cursor. Если я делаю это так:

String a = mOptionDb.fetchOption(0).getColumnName(0).toString(); 
String b = mOptionDb.fetchOption(0).getColumnName(1).toString(); 
String c = mOptionDb.fetchOption(0).getColumnName(2).toString(); 

Я только получить имя столбцов (_id, title, body), но не ценности. Любые предложения о том, как достичь этого?

ответ

80

Думаю, вы можете забыть о проверке нулевого значения.

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

Cursor cursor = fetchOption(0); 

if (cursor.moveToFirst()) // data? 
    System.out.println(cursor.getString(cursor.getColumnIndex("title")); 

cursor.close(); // that's important too, otherwise you're gonna leak cursors 

Он также может иметь смысл читать андроид учебник. Учебник из блокнота, похоже, соответствует счету: http://developer.android.com/guide/tutorials/notepad/index.html

+2

Благодарим вас за помощь. Теперь это работает. Я забыл каждый доступ, чтобы закрыть курсор ... –

+0

ваш ответ также поможет мне ... спасибо ... продолжайте отвечать .... +1 для вас. – Siten

+1

каждый раз, когда у меня возникает эта проблема, я возвращаюсь сюда и понимаю, что забыл cursor.moveToFirst(). благодаря! – user1549672

15

Вы можете использовать Cursor «s get* метод для извлечения значений из результата:

long id = cursor.getLong(cursor.getColumnIndex("_id")); 
long title = cursor.getString(cursor.getColumnIndex("title")); 
... 

Лучше практика, очевидно, использовать константы (часто предоставляемые ContentProviders) вместо вызовы getColumnIndex с закодированными строками.

+0

с частью: Int А = mOptionDb.fetchOption (0) .getColumnIndex ("название"); Я получаю «1». Но с mOptionDb.fetchOption (0) .getString (a); я получаю ошибки: ERROR/AndroidRuntime (628): Uncaught обработчик: нить главного выхода из-за неперехваченный исключение ERROR/AndroidRuntime (628): android.database.CursorIndexOutOfBoundsException: Index 0 требуется, с размером 0 Это как есть это не данные ?! –

6

Вы можете использовать этот механизм.

Cursor record=db.test(finalDate);  
if(record.getCount()!=0){ 
    if(record.moveToFirst()){ 
     do{    
      Imgid1=record.getString(record.getColumnIndex(Database.PHOTO));     
     }while(record.moveToNext());       
    } 
    record.close();   
} 
Смежные вопросы