2010-03-04 11 views
23

Estoy buscando para el más rápido y la manera correcta para comprobar si existe un registro en la base de datos:Existe el registro de Android() 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?

+0

Mi respuesta aquí: http://stackoverflow.com/questions/27597922/android-sqlite-check-if-row-exists-in-table/43849296#43849296 –

Respuesta

42

Considere que mDb es su clase

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; 
} 
  • SqlLiteDatabase que mantenga su parámetro _id como String pero creo que debe ser un Long.
  • 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 de selección.
  • puede poner la cadena select 1 from... en una constante final estática para ser aún más rápido.
+0

Si ha cambiado su pregunta mientras respondía. .. – tbruyelle

+4

también debe cerrar el cursor antes de devolver un valor. no causa un bloqueo, pero da advertencias. –

+0

sí, tienes razón, he actualizado mi respuesta – tbruyelle

1

Prueba esto:

En su DatabaseHelper, puesto que 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; 
} 

entonces en su OnClickListener, trate de llamar al método que se crea en su DatabaseHelper. Prueba 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(); 
5

Esta pregunta y la respuesta seleccionada fueron útiles para mí para entender cómo comprobar fácil y rápidamente si sale un récord. Sin embargo, he visto muchos lugares que recomiendan no usar rawQuery debido a la posibilidad de inyección SQL. (Por ejemplo, rawQuery Vs. database.query)

Así que aquí es lo que me decidí por:

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 ajustarse a las convenciones recomendadas de Android más.

actualización

ahora recomiendo @ respuesta de yuku, pero no voy a eliminar las minas todavía porque todavía quiero guiar a las personas lejos de usar consultas primas.

4

Ya que está buscando una respuesta de 'fuentes creíbles y/u 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, por uno más rápido:

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

Este fue el tipo de respuesta que estaba buscando cuando hice la recompensa. No conocía estos DatabaseUtils antes. Si no te importa, podría ¿explica brevemente por qué longForQuery es más rápido? La documentación es un poco escasa en eso. – Suragch

+0

Supongo que es más rápido debido a la cláusula LIMIT 1, lo que impide que cuente el número de filas si tienes múltiples filas que cumplen los criterios de selección. Sin embargo, dado que su criterio es _ID, que se puede suponer exclusivo para una tabla en particular, ambos deberían ser de la misma velocidad. – yuku

0

Esto funciona bien:

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