Android sqlite cómo verificar si existe un registro

Me gustaría verificar si existe un registro o no.

Esto es lo que he intentado:

MainActivity.class

public void onTextChanged(CharSequence s, int start, int before, int count) { System.out.println("Ontext changed " + new String(s.toString())); strDocumentFrom = s.toString(); if(s.toString().isEmpty()){ } else { try{ strTransactionDate = dbHelper.getTransactionDateByDocumentNumber(strDocumentFrom); //strTotalAmount = dbHelper.getTotalAmountByDocumentNumber(strDocumentFrom); //strVan = dbHelper.getVanByDocumentNumber(strDocumentFrom); //etTransactionDate.setText(strTransactionDate); //etTotalAmount.setText(strTotalAmount); //Log.d("Van", "" + strVan); //etVan.setText(strVan); } catch (SQLiteException e) { e.printStackTrace(); Toast.makeText(ReceivingStocksHeader.this, "Document number does not exist.", Toast.LENGTH_SHORT).show(); } } 

DBHelper.class

  // TODO DISPLAYING RECORDS TO TRANSRCVHEADER public String getTransactionDateByDocumentNumber(String strDocumentNumber){ String[] columns = new String[]{KEY_TRANSACTIONDATE}; Cursor c = myDataBase.query(TBL_INTRANS, columns, null, null, null, null, null, null); if(c != null){ c.moveToFirst(); String date = c.getString(0); return date; } else { Log.d("Error", "No record exists"); } return null; } 

Pero no llega al bloque catch para mostrar la tostada.

¿Qué estoy haciendo mal aquí?

 public static boolean CheckIsDataAlreadyInDBorNot(String TableName, String dbfield, String fieldValue) { SQLiteDatabase sqldb = EGLifeStyleApplication.sqLiteDatabase; String Query = "Select * from " + TableName + " where " + dbfield + " = " + fieldValue; Cursor cursor = sqldb.rawQuery(Query, null); if(cursor.getCount() < = 0){ cursor.close(); return false; } cursor.close(); return true; } 

Espero que esto te sea útil ... Esta función devuelve verdadero si el registro ya existe en db. De lo contrario, devuelve falso.

Todas estas son buenas respuestas, sin embargo, muchos olvidan cerrar el cursor y la base de datos . Si no cierra el cursor o la base de datos, puede ejecutar memory leaks.

Adicionalmente:
Puede obtener un error al buscar por String que contiene caracteres no alfa / numéricos. Por ejemplo: ” 1a5f9ea3-ec4b-406b-a567-e6927640db40 “. Esos guiones ( - ) causarán un error de unrecognized token . Puedes superar esto poniendo la cadena en una matriz. Así que haz un hábito para consultar de esta manera:

 public boolean hasObject(String id) { SQLiteDatabase db = getWritableDatabase(); String selectString = "SELECT * FROM " + _TABLE + " WHERE " + _ID + " =?"; // Add the String you are searching by here. // Put it in an array to avoid an unrecognized token error Cursor cursor = db.rawQuery(selectString, new String[] {id}); boolean hasObject = false; if(cursor.moveToFirst()){ hasObject = true; //region if you had multiple records to check for, use this region. int count = 0; while(cursor.moveToNext()){ count++; } //here, count is records found Log.d(TAG, String.format("%d records found", count)); //endregion } cursor.close(); // Dont forget to close your cursor db.close(); //AND your Database! return hasObject; } 

también puedes ver esto:

 if (cursor.moveToFirst()) { // record exists } else { // record not found } 

O

Simplemente revisa Cursor no nulo después de eso, ¿por qué no cuentas el conteo?

Entonces, que pruebes esto …

 DBHelper.getReadableDatabase(); Cursor mCursor = db.rawQuery("SELECT * FROM " + DATABASE_TABLE + " WHERE yourKey=? AND yourKey1=?", new String[]{keyValue,keyvalue1}); if (mCursor != null) { return true; /* record exist */ } else { return false; /* record not exist */ } 

Las consultas sin procesar son más vulnerables a la inyección de SQL. Sugeriré utilizar el método query() lugar.

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

Fuente: aquí

Puede usar el comando SELECT EXISTS y ejecutarlo para un cursor usando una materia rawQuery , de la documentación

El operador EXISTS siempre evalúa a uno de los valores enteros 0 y 1. Si la ejecución de la instrucción SELECT especificada como el operando de la derecha del operador EXISTS devolvería una o más filas, entonces el operador EXISTS evalúa a 1. Si ejecuta SELECT no devolvería ninguna fila, entonces el operador EXISTS evalúa a 0.

He intentado todos los métodos mencionados en esta página, pero solo debajo del método funcionó bien para mí.

 Cursor c=db.rawQuery("SELECT * FROM user WHERE idno='"+txtID.getText()+"'", null); if(c.moveToFirst()) { showMessage("Error", "Record exist"); } else { // Inserting record } 
 SQLiteDatabase sqldb = MyProvider.db; String Query = "Select * from " + TABLE_NAME ; Cursor cursor = sqldb.rawQuery(Query, null); cursor.moveToLast(); //if you not place this cursor.getCount() always give same integer (1) or current position of cursor. if(cursor.getCount()< =0){ Log.v("tag","if 1 "+cursor.getCount()); return false; } Log.v("tag","2 else "+cursor.getCount()); return true; 

si no usas cursor.moveToLast() ;

cursor.getCount() siempre da el mismo entero ( 1 ) o la posición actual del cursor.

Código:

 private String[] allPushColumns = { MySQLiteHelper.COLUMN_PUSH_ID, MySQLiteHelper.COLUMN_PUSH_TITLE, MySQLiteHelper.COLUMN_PUSH_CONTENT, MySQLiteHelper.COLUMN_PUSH_TIME, MySQLiteHelper.COLUMN_PUSH_TYPE, MySQLiteHelper.COLUMN_PUSH_MSG_ID}; public boolean checkUniqueId(String msg_id){ Cursor cursor = database.query(MySQLiteHelper.TABLE_PUSH, allPushColumns, MySQLiteHelper.COLUMN_PUSH_MSG_ID + "=?", new String [] { msg_id }, null, null, MySQLiteHelper.COLUMN_PUSH_ID +" DESC"); if(cursor.getCount() < = 0){ return false; } return true; } 

debido a posibles datos, se filtra la mejor solución a través del cursor:

  Cursor cursor = null; try { cursor = .... some query (raw or not your choice) return cursor.moveToNext(); } finally { if (cursor != null) { cursor.close(); } } 

1) Desde API KITKAT puedes usar recursos try ()

 try (cursor = ...some query) 

2) si consultas contra VARCHAR TYPE usa ‘…’ ej. COLUMN_NAME = ‘string_to_search’

3) no use moveToFirst () se usa cuando necesita comenzar a iterar desde el inicio

4) evitar getCount () es costoso: itera sobre muchos registros para contarlos. No devuelve una variable almacenada. Puede haber algo de almacenamiento en caché en una segunda llamada, pero la primera llamada no sabe la respuesta hasta que se cuenta.

Aquí hay una solución simple basada en una combinación de lo que dipali y Piyush Gupta publicaron:

  public boolean dbHasData(String searchTable, String searchColumn, String searchKey) { String query = "Select * from " + searchTable + " where " + searchColumn + " = ?"; return getReadableDatabase().rawQuery(query, new String[]{searchKey}).moveToFirst(); } 

Intenta usar el método cursor.isNull. Ejemplo:

 song.isFavorite = cursor.isNull(cursor.getColumnIndex("favorite")); 

Puedes usar así:

 String Query = "Select * from " + TABLE_NAME + " where " + Cust_id + " = " + cust_no; Cursor cursorr = db.rawQuery(Query, null); if(cursor.getCount() < = 0){ cursorr.close(); } cursor.close();