Android: SQLite – insertWithOnConflict

Estoy llamando a insertWithOnConflict, usando SQLiteDatabase.CONFLICT_IGNORE. Sin embargo, cuando se produce un conflicto "-1" se devuelve en lugar del id de la fila existente. ¿Cómo puedo corregir esto?

Creación de tablas:

EDIT:

String CREATE_CATEGORY_TABLE = "CREATE TABLE "+TABLE_CATEGORY+"(" + BaseColumns._ID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+ KEY_CATEGORY_NAME+" TEXT UNIQUE" + ")"; db.execSQL(CREATE_CATEGORY_TABLE); 

Insertar declaración:

 ContentValues values = new ContentValues(); values.put(KEY_CATEGORY_NAME, name); int catID = (int) db.insertWithOnConflict(TABLE_CATEGORY, null, values, SQLiteDatabase.CONFLICT_IGNORE); 

InsertWithOnConflict, utilizando SQLiteDatabase.CONFLICT_IGNORE no funciona como se esperaba y probablemente debería evitarse por completo, como en este problema:
https://code.google.com/p/android/issues/detail?id=13045

Android espera que la columna de clave principal se llame _id . Puede ser la causa: puesto que la columna no existe, no puede devolver el valor y devuelve -1.

SQLiteDatabase.CONFLICT_IGNORE comentario se supone que funciona de la misma manera que usted había observado. Al intentar insertar, si no hay ninguna fila en conflicto, se insertará una nueva fila con los valores dados y devolverá el id de la fila recién insertada. Por otro lado, si ya hay una fila en conflicto (con la misma clave única), los valores entrantes se ignorarán y la fila existente se conservará y el valor devuelto será -1 para indicar un escenario de conflicto. Para conocer más detalles y entender cómo manejar este valor de retorno, lea Android / SQLite: Insertar-Actualizar columnas de tabla para mantener el identificador

La solución que usé es usar insertOrThrow lugar de insertWithOnConflict y capturar explícitamente SQLiteConstraintException . Necesita capturarlo explícitamente porque hereda de RuntimeException .

Tuve que utilizar esta solución, ya que insert fue el dumping del esquema de base de datos a los registros cuando había un conflicto, y que era inaceptable.

 try { long id = db.insertWithOnConflict(StatusData.TABLE, null, values, SQLiteDatabase.CONFLICT_IGNORE); if (id == -1){ throw new RuntimeException(String.format("%s: Failed to insert [%s] to [%s] for unkwon reason.",TAG,values,uri)); }else return ContentUris.withAppendedId(uri, id); } 

Todavía puedo obtener la fila insertada en la base de datos, el CONFLICT_IGNORE no funciona como se esperaba @Tom es correcto, pero no estoy seguro de si ese problema fue corregido

  • Citas simples en sqlite en android
  • Android sqlite: cómo recuperar datos específicos de la columna en particular?
  • E / SQLiteLog (1893): (14) no puede abrir archivo en la línea 30176 de
  • Mueva el cursor a la fila por una de las columnas
  • GetWritableDatabase llamado recursivamente
  • Android abrir o crear base de datos
  • SQlite Selección de la tabla basada en el idioma
  • Error de SQLIte de Android: No se pudo leer la fila 0, col 1 de CursorWindow
  • ¿Debo habilitar la restricción de clave externa en onOpen o onConfigure?
  • Cómo extraer el cursor y el valor entero de una matriz de clase Object
  • Base de datos de SQLite Android eliminada después de desinstalar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.