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 Context.MODE_PRIVATE
  • ¿Cuándo es recomendable abrir y cerrar una base de datos?
  • Alternativas de SQLite para Android
  • No es posible obtener datos de la base de datos Sqlite
  • Java - java.lang.IllegalStateException: No se pudo leer la fila 0, col -1 de CursorWindow
  • GetWritableDatabase llamado recursivamente
  • Examinar la base de datos SQLite de mi aplicación para Android?
  • Ordenar los datos de la base de datos y mostrarlos en la vista de lista
  • ¿Cuál es la manera más rápida de analizar una cadena JSON en una tabla SQLite?
  • Preguntas sobre el uso de Android Backup Service con una base de datos SQLite
  • 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.