Android запись существует () в базе данных?

Я ищу самый быстрый и правильный способ проверить, существует ли запись в базе данных:

public boolean Exists(String _id) {
    Cursor c=db.query(TABLENAME(), new String[] {"1"}, "_ID="+_id, null, null, null, null);
    if (!c.equals(null))
        return c.moveToFirst();
    return false;
}

Вы видите какие-либо проблемы с этим?

6 ответов

Решение

Считают, что mDb твой SqlLiteDatabase учебный класс

public boolean Exists(String _id) {
   Cursor cursor = mDb.rawQuery("select 1 from yourTable where _id=%s", 
        new String[] { _id });
   boolean exists = (cursor.getCount() > 0);
   cursor.close();
   return exists;
}
  • Я держу ваш параметр _id как String но я думаю, что это должно быть Long,
  • select 1 быстрее чем select columnName потому что процессу не нужно извлекать все значения из таблицы в предложении select.
  • Вы можете поставить строку select 1 from... в статической конечной константе, чтобы быть еще быстрее.

Поскольку вы ищете ответ из "достоверных и / или официальных источников", здесь, в DatabaseUtils у нас есть метод под названием queryNumEntries,

Таким образом, ваш метод может быть сделан так:

public boolean Exists(String _id) {
    return DatabaseUtils.queryNumEntries(db, TABLENAME(), "_ID=?", new String[] {"1"}) > 0;
}

Или для более быстрого:

public boolean Exists(String _id) {
    return DatabaseUtils.longForQuery(db, "select count(*) from " + TABLENAME() + " where _ID=? limit 1", new String[] {"1"}) > 0;
}

Этот вопрос и выбранный ответ были полезны для меня, чтобы понять, как просто и быстро проверить, выходит ли запись. Тем не менее, я видел много мест, которые рекомендуют против использования rawQuery из-за возможности внедрения SQL. (Например, rawQuery Vs. database.query)

Итак, вот что я решил:

public boolean Exists(String searchItem) {

    String[] columns = { COLUMN_NAME };
    String selection = COLUMN_NAME + " =?";
    String[] selectionArgs = { searchItem };
    String limit = "1";

    Cursor cursor = db.query(TABLE_NAME, columns, selection, selectionArgs, null, null, null, limit);
    boolean exists = (cursor.getCount() > 0);
    cursor.close();
    return exists;
}

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

Обновить

Теперь я рекомендую ответ @ yuku, но пока не буду удалять свой, потому что я все еще хочу увести людей от использования необработанных запросов.

Попробуй это:

В вашем DatabaseHelper поместите этот метод...

public String Exist(String user) {        
     String username="";
     SQLiteDatabase db = this.getReadableDatabase();               

     try { 
         Cursor c = db.query(TABLE_USER, null, KEY_USER + "=?", new String[]{String.valueOf(user)},null, null, null);                                               

         if (c == null) {                        
             return username;                                   
         }
         else {    
             c.moveToFirst();               
             username = c.getString(c.getColumnIndex(KEY_USER)); 
         }                           
     }

     catch(Exception e){
         e.printStackTrace();
     }

     return username; 
}

затем в вашем onClickListener попробуйте вызвать метод, созданный в вашем DatabaseHelper. Попробуйте этот код:

String myUser = txtUser.getText().toString();
String storedUser = db.Exist(myUser);


//If Username exist
if (myUser.equals(storedUser)){
    Toast.makeText(getApplicationContext(), "Username already exist!", Toast.LENGTH_SHORT).show();

Это хорошо работает:

  Cursor cursor = null;
  String sql ="SELECT * FROM "+TableName+" WHERE ID="+idValue; 
  cursor= db.rawQuery(sql,null);
  Log.d("ISEXISTS","Cursor Count : " + cursor.getCount());

  boolean exists = (cursor.getCount() > 0);
  cursor.close();
Другие вопросы по тегам