В базе данных существует запись 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;
}
Вы видите какие-либо проблемы с этим?
Ответы
Ответ 1
Учтите, что 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...
в статическую конечную константу еще быстрее.
Ответ 2
Этот вопрос и выбранный ответ были полезны для меня, чтобы понять, как просто и быстро проверить, выходит ли запись. Тем не менее, я видел много мест, которые рекомендуют не использовать 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, но я не буду удалять мою, потому что я все еще хочу отвести людей от использования необработанных запросов.
Ответ 3
Поскольку вы ищете ответ из "достоверных и/или официальных источников", здесь в 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;
}
Ответ 4
Попробуйте следующее:
В вашем 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();
Ответ 5
Оформить свой ответ здесь:
Android Sqlite: проверьте, существует ли строка в таблице
Ответ 6
Это хорошо работает:
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();