2012-09-11 7 views
8

Sto chiamando insertWithOnConflict, utilizzando SQLiteDatabase.CONFLICT_IGNORE. Tuttavia, quando si verifica un conflitto, viene restituito "-1" anziché l'ID della riga esistente. Come posso correggere questo?Android: SQLite - insertWithOnConflict

creazione Tabella:

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

Inserire dichiarazione:

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

Un valore di ritorno di -1 indica che si è verificato un errore. Restituisce anche -1 se si inserisce una riga univoca (non in conflitto)? –

+0

@Graham Borland: No. Un inserto non in conflitto restituirà l'id corretto della riga. – meeeee

risposta

1

Android aspetta la colonna chiave primaria per essere chiamato _id. Potrebbe essere la causa: poiché la colonna non esiste, non può restituire il valore e restituisce -1.

+2

provato con BaseColumns._ID ma ottengo ancora -1, – meeeee

1

SQLiteDatabase.CONFLICT_IGNORE si suppone che il funzionamento funzioni nello stesso modo in cui è stato osservato. Durante il tentativo di inserimento, se non ci sono righe in conflitto, inserisce una nuova riga con i valori specificati e restituisce l'id della riga appena inserita. D'altra parte, se esiste già una riga in conflitto (con la stessa chiave univoca), i valori in entrata verranno ignorati e la riga esistente verrà mantenuta e quindi il valore restituito sarà -1 per indicare uno scenario di conflitto. Per conoscere ulteriori dettagli e per capire come gestire questo valore di ritorno, si prega di leggere 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); 
    } 

io sono ancora in grado di ottenere la riga inserita nel database, il CONFLICT_IGNORE non funziona come previsto @ Tom è giusto, ma io non sono sicuro se questo problema è stato risolto

1

la soluzione che ho usato sta utilizzando insertOrThrow anziché insertWithOnConflict e che rileva esplicitamente SQLiteConstraintException. Devi prenderlo esplicitamente perché eredita da RuntimeException.

Ho dovuto utilizzare questa soluzione alternativa perché insert stava scaricando lo schema del database nei registri in caso di conflitto e ciò era inaccettabile.