Android sqlLite ON CONFLICT IGNORE se ignora en ICS
Tengo una tabla simple de la dirección con la declaración siguiente de la creación:
"CREATE TABLE " + ADDRESSES_TABLE + " (" + KEY_ADDRESS_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_ADDRESS_COUNTRY + " TEXT, " + KEY_ADDRESS_CITY + " TEXT, " + KEY_ADDRESS_STREET + " TEXT, " + KEY_ADDRESS_HOUSE + " TEXT, " + KEY_ADDRESS_POSTAL_CODE + " TEXT," + "UNIQUE("+KEY_ADDRESS_COUNTRY+","+KEY_ADDRESS_CITY+","+KEY_ADDRESS_STREET+","+KEY_ADDRESS_HOUSE+","+KEY_ADDRESS_POSTAL_CODE +") ON CONFLICT IGNORE)"
Cuando agrego registros duplicados, el método insert () devuelve -1 y no el id de la fila existente.
- Cómo utilizar SQLiteDatabase.CursorFactory
- Extraer una base de datos del emulador genymotion a un disco local
- Sincronizar / actualizar bases de datos sqlite
- Compruebe si la consulta SQL ha tenido éxito en Android SQLite
- ¿Cómo agregar una nueva columna a la base de datos SQLite de Android?
El problema es reproducible sólo en 4.0+. El método funciona como se esperaba en 2.2 y 2.3.3.
¿Alguien se ha enfrentado al mismo problema?
- Error al abrir la base de datos / Error al cambiar la configuración regional de (base de datos) a 'en_US'
- Android sqlite rollback
- ¿Cómo realizar una consulta SQLite dentro de una aplicación de Android?
- Eliminar el número especificado de filas de la base de datos SQLite
- Rendimiento de procesamiento de datos recursivo utilizando Java y SQLite
- ¿Cómo obtener el recuento de filas de una consulta en Android usando SQLite?
- GreenDAO soporta múltiples relaciones entre tablas
- ¿Cómo establecer el tipo de datos en SQLiteDatabase vinculación de consulta en bruto?
Desafortunadamente, la documentación de Android está equivocada. (Y por lo tanto, su código no funciona como se esperaba en versiones anteriores de Android, por ejemplo, 2.2 y 2.3.)
En 2.2 y 2.3, insertWithOnConflict()
devolverá el valor de la función SQLite C API sqlite3_last_insert_rowid () , cuya documentación indica claramente que los insertos fallidos (por ejemplo, donde se aplica la resolución ON CONFLICT, como IGNORE) no afectan al valor de retorno . Por lo tanto, si no se realizó ninguna inserción previa para la conexión y se intenta una inserción duplicada, insertWithOnConflict()
devolverá 0. Si una inserción anterior agregó una fila a cualquier tabla, el método devolverá el id de fila de esa inserción — de Por supuesto que esto es muy incorrecto.
En 4.0, insertWithOnConflict()
devolverá el valor de la misma función SQLite C API, excepto devolver -1 en lugar de 0.
Este cambio es la razón por la que ahora está observando el error. Pero si comprueba el resultado de cerca en 2.2 y 2.3, verá que los identificadores de fila devueltos cuando se ejerce la cláusula OR IGNORE
no son en realidad los ids de fila correctos (excepto coincidentemente).
- Android con Gradle (Java terminado con valor de salida no nulo 2)
- Botón de acción flotante El color del borde no está cambiando