2010-08-05 4 views
9

Quando sto cercando di eseguire il seguente:impossibile inserire in SQLite, il codice di errore: 19

ContentValues cv = new ContentValues(); 
    cv.put(table_LocalSettings_Unit, input); 
    mDb.insert(table_LocalSettings, "", cv); 

ho ottenuto il seguente errore:

Error inserting unit = 0;
SqliteConstraintException: error code 19 constraint failed.

Quale dovrebbe essere il problema? Il Codice sql tabella è:

"create table if not exists " + table_LocalSettings + "(" + table_LocalSettings_ID 
    + " INTEGER PRIMARY KEY NOT NULL , " + table_LocalSettings_MapType 
    + " INTEGER NOT NULL , " + table_LocalSettings_Visib + " BIT NOT NULL , " 
    + table_LocalSettings_Unit + " INTEGER DEFAULT 0 NOT NULL , " 
    + table_LocalSettings_SpeedUnit + " INTEGER NOT NULL , " 
    + table_LocalSettings_Alert + " BIT NOT NULL ," + table_LocalSettings_UserID 
    + " INTEGER DEFAULT -1 , " + table_LocalSettings_Username + " VARCHAR , " 
    + table_LocalSettings_PowerSave + " VARCHAR , " + table_LocalSettings_PremiumUser 
    + " INTEGER NOT NULL DEFAULT 0);"; 

risposta

11

constraint failed

Suona come la chiave primaria esiste già nella tabella

+0

avevo aggiornato la prima domanda. Vedi qualcosa di sbagliato sul mio sql? Non posso! – Karoly

+0

Sembra che tu non stia collegando il valore contentvalues ​​per la chiave primaria. E questo è fallimentare poiché la creazione della tabella manca la direttiva autoincrement, sarebbe qualcosa di simile: '' _id 'intero PRIMARY KEY AUTOINCREMENT NOT NULL' – Pentium10

+0

variabile di input è un intero – Karoly

4

Ho avuto lo stesso problema e la risposta Pentium 10 mi ha portato nella direzione corretta. Dopo aver verificato che il codice del muggito era sbagliato, correggendolo, ho cancellato i dati dall'app nell'emulatore e questo ha ricreato il DB e ora funziona bene.

 "create table if not exists " + DATABASE_TABLE + " (" + _ID + " integer primary key autoincrement," + 
    " ItemName text not null, ItemID text not null, Image text not null, ImageDate text not null);"; 

Penso che uno dei miei problemi era che avevo una colonna in più. Ho rimosso una delle colonne in precedenza e non l'ho rimosso dalle righe precedenti.

La cosa principale è tripple controllare il codice per errori e ortografia e se si utilizza l'emulatore cancellare i dati.

2

È possibile visualizzare un elenco di tutti i codici di errore SQLite qui http://www.sqlite.org/c3ref/c_abort.html. Il codice di errore 19 indica che un vincolo di tabella (NOT NULL, UNIQUE, ecc.) È stato violato durante l'operazione (INSERT, ecc.). Dall'osservazione della logica di creazione della tabella, molti dei tuoi campi sono impostati su NOT NULL, tuttavia stai solo tentando di inserire una singola colonna. Se crei la tua tabella in modo tale che i valori non possano essere nulli, devi inserire un valore non nullo durante l'INSERT, altrimenti vedrai il codice di errore 19. Potresti anche rimuovere il vincolo dalla tua tabella di database se non è necessario .

Come nota a margine, ci sono altri metodi di inserimento che permettono di gestire la violazione del vincolo, come

db.insertWithOnConflict(..., ..., ..., INTEGER); 

dove l'intero è una delle variabili di risoluzione dei conflitti statiche della classe SQLiteDatabase (ma non lo faccio pensate che qualcuno di loro consenta la violazione di NOT NULL). È inoltre possibile leggere ulteriori informazioni sulle opzioni di risoluzione dei conflitti SQLite qui: http://www.sqlite.org/conflict.html

2

È possibile rimuovere il not null dalla tabella e funzionerà correttamente. in questo modo:
destra:

String callTable = "CREATE TABLE IF NOT EXISTS '%s'" + "(userid VARCHAR, callwith VARCHAR, calltype VARCHAR, callstart time, callend time, callmedia VARCHAR" + ");" 

sbagliato:

String callTable = "CREATE TABLE IF NOT EXISTS '%s'" + "(userid VARCHAR not Null , callwith VARCHAR not null, calltype VARCHAR, callstart time, callend time, callmedia VARCHAR" + ");" 
+0

Non c'è niente di 'sbagliato' con' NOT NULL' in uso. Dichiara che un valore non può essere nullo. – Hobbyist