Android SQL – Compruebe si toda la fila ya existe en la base de datos
Estoy tratando de crear una simple aplicación de favoritos, donde puedes guardar tus páginas favoritas (de la web, por ejemplo).
Digamos que tengo los siguientes datos en mi base de datos
- Android - ¿Cómo puedo ver una base de datos SQL creada en mi aplicación? Lo estoy ejecutando en el emulador de Android de Eclipse
- Android: Cómo sumar todas las columnas de una base de datos SQLite y devolver 1 variable única
- Uso de DAO verde con el proveedor de contenido
- Instalar android sdk usando la línea de comandos linux
- Android, cómo ejecutar un archivo sql en sqlitedatabase
Title | URL | TAG | ------------------------------- Hey Ho.com Site Jo Jo.com Image Jo Mo.com Image
Ahora quiero asegurarme, el usuario no agrega la misma página dos veces, así que comprobaré si el valor ya existe. Pero necesito que el usuario no agregue un sitio a la tabla que se ha agregado ya.
Así que digamos que intentaría agregar:
Title | URL | TAG | ------------------------------- Jo Mo.com Image
Esto devolvería true (para "comprobar si existe fila", porque ya existe una fila idéntica).
Pero si quisiera agregar:
Title | URL | TAG | ------------------------------- Jo Go.com Image
Devolvería false (aunque el título ya existe), porque no hay una fila idéntica.
Este es el código en el que agrego mis datos a la base de datos con:
public long createNote(String title, String url, String rn) { ContentValues initialValues = new ContentValues(); initialValues.put(KEY_TITLE, title); initialValues.put(KEY_URL, url); initialValues.put(KEY_RN, rn); return mDb.insert(DATABASE_TABLE, null, initialValues);
¿Cómo puedo comprobar si una fila ya existe en una base de datos?
- Android - Acceso a la base de datos en línea SQlite
- Firebase - Transmisión de información de la actividad con persistencia activada
- Firebase Android: lento "unirse" con muchos oyentes, parece contradecir la documentación
- SQLite de Android: reemplaza la base de datos antigua por una nueva o usa scripts de migración
- Android - ¿Dónde está la base de datos SQLite almacenada
- Db-shm y db-wal en bases de datos sqlite
- Android.database.sqlite.SQLITeException: no hay tal tabla: admin mientras compila: INSERT INTO ... etc
- Aplicación de Android (Samsung Galaxy Tab, 2.2) no * a veces * escribir en el DB
Puede comprobar con el cursor:
public boolean checkEvent(String title, String URL, String tag) { SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.query(TABLES, new String[] { KEY_TITLE,KEY_URL,KEY_TAG }, KEY_TITLE + " = ? and "+ KEY_URL + " = ? and " + KEY_TAG + " = ?" , new String[] {title,url,tag}, null, null, null, null); if(cursor.moveToFirst()) return true; //row exists else return false; }
Editar: Código ahora copiar y pegar listo
Hay una forma muy graciosa (imho) de hacerlo a nivel de base de datos. Agregue esto a su tabla de creación sql cuando cree su base de datos:
UNIQUE(TITLE, URL) ON CONFLICT REPLACE
A continuación, puede insertar todo lo que quiera sin comprobar, se agregará o actualizará si la fila ya está allí.
Puede consultar para ver si existe un identificador único en la base de datos, en su caso el título quizás el identificador único de la fila.
public boolean isEntry(int title){ String queryString = "SELECT * FROM "+TABLE_NAME+" WHERE "+KEY_PROJECT_ID+" = "+"'"+project_id+"'"; Cursor c = db.rawQuery(queryString, null); if(c.getCount() > 0){ Log.i("CHECK", "true"); return true; } else{ return false; } }
Aquí la true
significaría que hay una fila como esta, false
significaría que no hay tal entrada.
Ahora digamos están a punto de insertar una entrada en la base de datos. Incluso si el método devuelve un valor true
, lo que puede hacer es comparar los otros dos valores como en su ejemplo. Después de eso, podría llamar a una función para devolver una sola fila de la base de datos, como
public String getCursor(int project_id){ String queryString = "SELECT * FROM "+TABLE_NAME+" WHERE "+KEY_PROJECT_ID+" = "+"'"+project_id+"'"; Cursor cursor = db.rawQuery(queryString, null); return cursor; }
Una vez que tenga la función puede seleccionar la TAG
y la URL
de ella y ver si coincide con la de su base de datos.
Me gusta esto:
Cursor cursor = db.rawQuery(queryString, null); String tag = ""; String url = ""; cursor.moveToFirst(); for (int i = 0; i < cursor.getCount(); i++) { like_state = cursor.getString(cursor.getColumnIndex(KEY_TAG)); url = cursor.getString(cursor.getColumnIndex(KEY_URL)); cursor.moveToNext(); } cursor.close(); if(!ins_tag.equalsIgnoreCase(tag) || !ins_url.equalsIgnoreCase(url)) { //insert function here }
Y como se menciona en los comentarios, debe utilizar el entero AUTOINCREAMENT como clave primaria.