Android запись существует () в базе данных? - PullRequest
23 голосов
/ 04 марта 2010

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

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 ]

42 голосов
/ 04 марта 2010

Учтите, что 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... в конечную статическую константу, чтобы быть еще быстрее.
5 голосов
/ 04 марта 2015

Поскольку вы ищете ответ из «достоверных и / или официальных источников», здесь, в 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;
}
5 голосов
/ 12 августа 2014

Этот вопрос и выбранный ответ были полезны для меня, чтобы понять, как просто и быстро проверить, выходит ли запись. Тем не менее, я видел много мест, которые рекомендуют не использовать 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, но пока не буду удалять свой, потому что все еще хочу увести людей от использования необработанных запросов.

1 голос
/ 22 мая 2013

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

В вашем 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();
0 голосов
/ 30 августа 2017

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

  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();
0 голосов
/ 08 мая 2017
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...