2013-09-19 5 views
1

Я использую эту функцию, чтобы получить конкретные данные из SQLite:Проверьте, если данные существуют в SQLite Android

SearchRes getSresultByName(String name) { 
    SQLiteDatabase db = this.getReadableDatabase(); 

    Cursor cursor = db.query(TABLE_WIKIRES, new String[] { KEY_ID, 
      KEY_SNAME, KEY_SJSON }, KEY_SNAME + "=?", 
      new String[] { name }, null, null, null, null); 

    if (cursor != null) 
     cursor.moveToFirst(); 

    SearchRes searchres = new SearchRes(Integer.parseInt(cursor.getString(0)),cursor.getString(1), cursor.getString(2)); 

    return searchres; 
} 

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

boolean checkIfExist(String name) { 
    SQLiteDatabase db = this.getReadableDatabase(); 

    Cursor cursor = db.query(TABLE_WIKIRES, new String[] { KEY_ID, 
      KEY_SNAME, KEY_SJSON }, KEY_SNAME + "=?", 
      new String[] { name }, null, null, null, null); 


    if (cursor == null) 
     return false; 

    else 
     return true; 

} 

Но я всегда получаю ИСТИННУЮ. Можете ли вы помочь мне выяснить, в чем проблема?

+0

http://stackoverflow.com/questions/18868712/android-sqlite-search-by-na me # 18868911 – Selvin

ответ

6

вы не следует проверять, если курсор является пустым, вы должны проверить, если что-то существует в курсоре

if(cursor.moveToFirst()){ 
    return true 
}else{ 
    return false; 
} 
2

Вы можете попробовать CursorgetCount(), чтобы проверить количество строк в результате запроса .. Ниже приводится пример кода:

boolean checkIfExist(String name) { 
    SQLiteDatabase db = this.getReadableDatabase(); 

    Cursor cursor = db.query(TABLE_WIKIRES, new String[] { KEY_ID, 
      KEY_SNAME, KEY_SJSON }, KEY_SNAME + "=?", 
      new String[] { name }, null, null, null, null); 


    if (cursor.getCount() > 0) 
     return true; 

    else 
     return false; 

} 

ответ на @tyczj тоже хорошо ..

+0

делать это избыточно, потому что, если есть счетчик> 0, вы должны вызывать 'movetoFirst()' в любом случае, иначе вы получите ошибку за пределами – tyczj

+0

согласитесь .. но цель метода заключается не в том, чтобы читать данные, но проверить, существуют ли данные .. и, как я уже упоминал в своем ответе .. оба подхода хороши .. –

+0

Как объяснил [Doug Currie] (http://stackoverflow.com/a/8618629/342618), getCount() потенциально очень дорогостоящая операция. Поэтому я бы посоветовал избегать этого, если вам не нужно получить общий счет. – ChrisD

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