SQLiteDatabase: Insertar sólo si el valor no existe (no a través del comando raw SQL)

Sé que hay un comando de SQL que va como esto: IF NOT EXISTS , pero desde la clase SQLiteDatabase de Android tiene algunos métodos finos, me preguntaba si es posible insertar un valor si no existe a través de un método.

Actualmente estoy usando esto para insertar una String :

 public long insertString(String key, String value) { ContentValues initialValues = new ContentValues(); initialValues.put(key, value); return db.insert(DATABASE_TABLE, null, initialValues); } 

( db es una instancia de SQLiteDatabase .)

He intentado el método insertOrThrow() lugar de insert() , pero parece que hace lo mismo que insert() . Es decir, si el valor ya está en la fila, se inserta de nuevo para que la fila tenga ahora dos valores del mismo valor.

SQLiteDatabase: Insertar sólo si el valor no existe (no a través del comando raw SQL)

Puesto que usted no desea utilizar las preguntas sin procesar usted puede lograrlo que antes de insertar, apenas crea una cierta función que probará si el valor está ya en base de datos. Podría devolver boolean (o int) y si devuelve false, se realizará la consulta insert.

Un pequeño ejemplo:

 public int getCount() { Cursor c = null; try { db = Dbhelper.getReadableDatabase(); String query = "select count(*) from TableName where name = ?"; c = db.rawQuery(query, new String[] {name}); if (c.moveToFirst()) { return c.getInt(0); } return 0; } finally { if (c != null) { c.close(); } if (db != null) { db.close(); } } } if (getCount() == 0) { //perform inserting } 

Si el valor ya está en la fila, se inserta de nuevo para que la fila tenga ahora dos valores del mismo valor.

Esto puede resolverse mediante el uso de restricciones adecuadas que no le permitirán insertar duplicados. Mira esto:

  • Restricciones en SQLite

Puede configurar el comportamiento CONFLICT_IGNORE para el conflicto de inserción de fila:

 public long insertString(String key, String value) { ContentValues initialValues = new ContentValues(); initialValues.put(key, value); return db.insertWithOnConflict(DATABASE_TABLE, null, initialValues, SQLiteDatabase.CONFLICT_IGNORE); } 

Pero esto depende de la restricción. Hay más comportamientos si necesita en el futuro.

Hay dos maneras básicas de hacerlo:

  1. Consulta la base de datos. Compruebe manualmente si los datos ya existen y luego agregó si no existe.
  2. Utilice CONSTRAINT s . Defina su esquema SQL para permitir únicamente datos únicos para esta columna.

El primer enfoque es más fácil si desea realizar diferentes acciones en diferentes circunstancias (o si ya no es competente en SQL). El segundo enfoque se puede hacer con mucho menos mecanografía y puede aplicarse universalmente.

La solución no está en Android Api, pero en la base de datos. Si desea asegurarse de que la cadena que inserta no está ya presente en la base de datos, hay dos soluciones posibles.

  1. Al crear la base de datos haga que la columna (la cadena que quería insertar) como UNIQUE , esto evitará que ingrese duplicados en esa columna. Y cuando usted intenta insertar y es un duplicado lanzará un error; Se puede manejar a través de la gestión de excepciones.

  2. Puede crear un segundo método (invocado después de cada inserción, esto es costoso) que comprueba si hay duplicados en la tabla y los elimina.

Yo iría con enfoque 1.

Aquí hay una muestra de sintaxis UNIQUE

create table tablename( col1 datatype, col2 datatype, col3 datatype, UNIQUE(col1));

buena suerte

  • SQLite de Android - Clave principal - Insertar en la tabla
  • Insertar null en la tabla Sqlite
  • Error de SQLIte de Android: No se pudo leer la fila 0, col 1 de CursorWindow
  • Aclaración sobre el row_id devuelto por la instrucción de inserción de sqlite
  • Cómo obtener fechas de la base de datos y comprobar si se solapan?
  • La tabla de actualización utilizando el método rawQuery () no funciona
  • No puede ver datos Sqlite con adaptador simple
  • ¿El depurador de Android trunca mensajes de depuración?
  • ¿Cómo puedo insertar una base de datos SQLite en una aplicación?
  • Abrir y editar archivos PDF en la aplicación de Android con API
  • SQLiteException: cerca de "": error de sintaxis (código 1) al compilar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.