Android insertWithOnConflict devolviendo el valor equivocado

Estoy utilizando la función insertWithOnConflict en Android / SQLite para insertar valores que potencialmente ya existen en la base de datos. De acuerdo con la documentación de Android, si el valor existe, se devolverá la clave principal:

Returns the row ID of the newly inserted row OR the primary key of the existing row if the input param 'conflictAlgorithm' = CONFLICT_IGNORE OR -1 if any error 

Sin embargo, al utilizar esta función, la clave primaria existente no se devuelve si la fila ya existe. En su lugar, autoincrementará la clave primaria y devolverá ese valor, aunque no se inserten datos en la fila para el id que se devuelve.

La llamada a la función en sí es relativamente simple:

 name_id = db.insertWithOnConflict("names", null, name_values, SQLiteDatabase.CONFLICT_IGNORE); 

Pasó conmigo también. También vi algunos casos más bizzare donde me devolvió 0 también. Parece que hay algún problema en el nivel de API. Han revertido de nuevo a insertOrThrow y eso ha funcionado para mí sine entonces.

Este es un error conocido (y ha sido desde 2010):
https://code.google.com/p/android/issues/detail?id=13045

Y hay otros problemas con esta API, por ejemplo
https://code.google.com/p/android/issues/detail?id=3302

Creo que la mejor solución es simplemente evitar esta API (como sugiere Nazgul).

  • Android, cómo ejecutar un archivo sql en sqlitedatabase
  • Almacenamiento de números de coma flotante en la base de datos android
  • Persa / búsqueda árabe en sqlite android da mal resultado
  • Leer sólo la actualización de la base de datos SQLite en la carpeta de activos para la nueva versión de la aplicación
  • Jest error de caso de prueba en reactivo nativo mediante el complemento externo
  • cómo crear base de datos una sola vez, a continuación, leer y escribir varias veces desde él, SQLite, OpenHelper, Android
  • No se puede cerrar debido a declaraciones sin finalizar Android
  • SQLite onUpgrade ()
  • Depuración de la base de datos sqlite en el dispositivo
  • La escritura concurrente a la base de datos android (de múltiples servicios)?
  • Androide sqlite comprobar si se ha insertado un nuevo valor
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.