2016-01-31 3 views
1

Я делаю приложение для Android, где храню некоторые id в базе данных sqlite. В зависимости от действия пользователя я либо добавляю идентификатор, если он еще не добавлен, либо удаляет идентификатор, если он уже добавлен. Но проблема заключается в том, что курсор в моем методе getExhibitor (int id) всегда возвращает true. Я не понимаю, почему. Может ли кто-нибудь помочь?Почему курсор никогда не равен нулю?

public class Interests extends SQLiteOpenHelper { 

    private Context context; 
    private static final int DATABASE_VERSION=1; 
    private static final String DATABASE_NAME="userInterests"; 
    private static final String TABLE_EXHIBITORS="exhibitors"; 
    // Column Names // 
    private static final String KEY_ID="id"; 

    public Interests(Context context) { 
     super(context,DATABASE_NAME,null,DATABASE_VERSION); 
     this.context=context; 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     final String createQuery="CREATE TABLE IF NOT EXISTS "+TABLE_EXHIBITORS+"(" 
       +KEY_ID+" INTEGER PRIMARY KEY)"; 
     db.execSQL(createQuery); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

     db.execSQL("DROP TABLE IF EXISTS"+TABLE_EXHIBITORS); 
     onCreate(db); 
    } 

    public void addExhibitor(int id){ 
     SQLiteDatabase db=this.getWritableDatabase(); 
     ContentValues values=new ContentValues(); 
     values.put(KEY_ID,id); 
     db.insert(TABLE_EXHIBITORS,null,values); 
     db.close(); 
     Toast.makeText(context,"Exhibitor added",Toast.LENGTH_SHORT).show(); 
    } 

    //This method is faulty// 
    public boolean getExhibitor(int id){ 
     SQLiteDatabase db=this.getReadableDatabase(); 
     Cursor c=db.query(TABLE_EXHIBITORS,new String[]{KEY_ID},KEY_ID+" = ? ",new String[]{String.valueOf(id)},null,null,null); 
     c.close(); 
     return (c!=null); //Always true 
    } 

    public void removeExhibitor(int id){ 
     SQLiteDatabase db=this.getWritableDatabase(); 
     db.delete(TABLE_EXHIBITORS,KEY_ID+" = ?",new String[]{String.valueOf(id)}); 
     Toast.makeText(context,"Exhibitor removed",Toast.LENGTH_SHORT).show(); 
     db.close(); 
    } 
} 

ответ

4

Вы должны проверить содержание курсоров.

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

Пока курсор не будет null, так как вы сделали правильный запрос, он будет, вероятно, getCount() == 0 или 1, в зависимости, если он находится в БД или нет.

+1

В качестве альтернативы используйте [queryNumEntries] (http://developer.android.com/reference/android/database/DatabaseUtils.html#queryNumEntries%28android.database.sqlite.SQLiteDatabase,%20java.lang.String,%20java. lang.String,% 20java.lang.String []% 29), чтобы получить только количество совпадающих строк. –

-1

Возвращает null при возникновении некоторой ошибки. Вы можете попробовать использовать getCount.

+0

При возникновении некоторой ошибки запрос вызывает запрос. –

+0

Да, извините, я выразил плохо –

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