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.

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?

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).

  • Recuperar un nombre de usuario y una contraseña en SQLITE DB por EMAIL_ADDRESS en ANDROID
  • Mueva el cursor a la fila por una de las columnas
  • Creación de restricciones de clave externa en ORMLite en SQLite
  • Sqlite query using foreign keys
  • Almacenamiento de bases de datos SQLite con Android y Phonegap
  • Uso del patrón de diseño Singleton para SQLiteDatabase
  • Cómo abrir / cerrar SQLite db en Android correctamente
  • ¿Consulta para obtener registros basados ​​en Radius en SQLite?
  • SQLiteReadOnlyDatabaseException: intento de escribir una base de datos readonly (código 1032)
  • Uso de la palabra clave IN en android sqlite
  • Cómo lograr una relación de "herencia" en la base de datos SQLite en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.