Android registro existe () en la base de datos?

Estoy buscando la forma más rápida y correcta para comprobar si existe un registro en la base de datos:

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; } 

¿Ve algún problema con él?

Considere que mDb es su clase 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; } 
  • Mantengo su parámetro _id como una String pero creo que debería ser un Long .
  • select columnName select 1 es más rápido que select columnName porque el proceso no necesita recuperar todos los valores de la tabla en la cláusula select.
  • Usted puede poner la secuencia de select 1 from... en una constante final estática para ser aún más rápido.

Puesto que usted está buscando una respuesta de "fuentes creíbles y / o oficiales", aquí en DatabaseUtils tenemos un método llamado queryNumEntries .

Así que su método podría hacerse así:

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

O, para una más rápida:

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

Esta pregunta y la respuesta seleccionada me ayudaron a comprender cómo comprobar de forma simple y rápida si un registro sale. Sin embargo, he visto muchos lugares que recomiendan contra el uso de rawQuery debido a la posibilidad de inyección de SQL. (Por ejemplo, rawQuery Vs. database.query )

Así que aquí está lo que decidí:

 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; } 

No sé si esto es tan rápido como la respuesta seleccionada o no, pero después de investigar esto parece conformarse a las convenciones recomendadas de Android más.

Actualizar

Ahora recomiendo la respuesta de @ yuku, pero no borraré la mía todavía porque todavía quiero guiar a la gente lejos de usar consultas sin procesar.

Prueba esto:

En su DatabaseHelper, ponga este método …

 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; } 

A continuación, en su onClickListener, intente llamar al método que crea en su DatabaseHelper. Pruebe este código:

 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(); 

Comprobar mi respuesta aquí: Android Sqlite: Compruebe si existe fila en la tabla

  • Singletons no disponibles cuando la aplicación vuelve a la memoria
  • Volley - No se puede resolver el constructor "JSONObjectRequest
  • ¿Cómo obtener Entity en el servlet usando MultipartEntity?
  • No vuelva a ejecutar la llamada de Retrofit si todavía está en curso con RxJava 2
  • La dependencia de compilación Gradle no se agrega a classpath
  • Android ndk: Problema para la llamada del método Java desde c ++ con jni
  • GetLayoutParams (). Width VS setMax / MinimumWidth () para ImageView
  • La interfaz de usuario de Tablet no funciona en mi aplicación
  • Uso de Volley y Gson: Analiza el elemento y la lista de elementos
  • ¿Cómo uso el ActionBar en las versiones anteriores de Android?
  • JAVA_HOME se establece en un directorio no válido mientras se ejecuta ./gradlew en OSX
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.