2012-09-11 28 views
8

Llamo a insertWithOnConflict, usando SQLiteDatabase.CONFLICT_IGNORE. Sin embargo, cuando ocurre un conflicto, se devuelve "-1" en lugar de la identificación de la fila existente. ¿Cómo puedo corregir esto?Android: SQLite - insertWithOnConflict

creación de la tabla:

EDIT: declaración

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:

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

Un valor de retorno de -1 significa que se ha producido un error. ¿También devuelve -1 si inserta una fila única (no conflictiva)? –

+0

@Graham Borland: No. Una inserción no conflictiva devolverá la identificación de fila correcta. – meeeee

Respuesta

1

Android espera que la columna de clave principal que se llama _id. Podría ser la causa: dado que la columna no existe, no puede devolver el valor y devuelve -1.

+2

intenté usar BaseColumns._ID, pero sigo obteniendo -1, – meeeee

1

El comentario de SQLiteDatabase.CONFLICT_IGNORE se supone que funciona de la misma manera que lo había observado. Al intentar insertar, si no hay una fila en conflicto, insertará una nueva fila con los valores dados y devolverá la identificación de la fila recién insertada. Por otro lado, si ya hay una fila conflictiva (con la misma clave única), los valores entrantes serán ignorados y la fila existente será retenida y luego el valor de retorno será -1 para indicar un escenario de conflicto. Para conocer más detalles, y para entender cómo manejar este valor de retorno, por favor, lea Android/SQLite: Insert-Update table columns to keep the identifier

0
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 soy capaz de conseguir la fila insertada en la base de datos, la CONFLICT_IGNORE no funciona como se esperaba @ Tom está bien, pero no estoy seguro de si ese problema se solucionó

1

la solución que he usado es el uso insertOrThrow en lugar de insertWithOnConflict, y captura explícitamente SQLiteConstraintException. Necesitas atraparlo explícitamente porque hereda de RuntimeException.

Tuve que utilizar esta solución porque insert estaba volcando el esquema de base de datos a los registros cuando había un conflicto, y eso era inaceptable.