2010-08-05 12 views
9

Cuando estoy tratando de ejecutar el siguiente:No se puede insertar en SQLite, Código de error: 19

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

me dieron el siguiente error:

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

¿Cuál debe ser el problema? El código SQL tabla es:

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

Respuesta

11

constraint failed

Suena como su clave primaria ya existe en la tabla

+0

había actualizado la primera pregunta. ¿Ves algo mal en mi sql? No puedo! – Karoly

+0

Parece que no está adjuntando el valor de valores de contenido para la clave principal. Y esto falla ya que a la creación de la tabla le falta la directiva autoincrement, sería algo así como: ''_id' integer PRIMARY KEY AUTOINCREMENT NOT NULL' – Pentium10

+0

variable de entrada es un entero – Karoly

4

que tenía el mismo problema y la respuesta del Pentium 10 me llevó en la dirección correcta. Después de verificar que el código de abajo era incorrecto, corrigiéndolo borré los datos de esa aplicación en el emulador y recultó el DB y funciona bien ahora.

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

Creo que uno de mis problemas fue que tenía una columna extra. Eliminé una de las columnas antes y no la eliminé de las líneas anteriores.

Lo principal es comprobar el código de error y ortografía y, si se utiliza el emulador, borrar los datos.

2

Puede ver una lista de todos los códigos de error SQLite aquí http://www.sqlite.org/c3ref/c_abort.html. El código de error 19 significa que una restricción de tabla (NOT NULL, UNIQUE, etc.) fue violada durante la operación (INSERT, etc.). Al observar la lógica de creación de la tabla, muchos de sus campos están configurados en NOT NULL, pero solo está intentando insertar una sola columna. Si crea su tabla de modo que los valores no puedan ser nulos, debe incluir un valor no nulo durante INSERTAR; de lo contrario, verá el código de error 19. También puede eliminar la restricción de la tabla de la base de datos si no es necesaria. .

Como nota al margen, hay otros métodos de inserción que permiten el manejo de la violación de restricción, como

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

donde entero es una de las variables estáticas de resolución de conflictos en la clase SQLiteDatabase (pero no lo hago creo que cualquiera de ellos permite la violación NOT NULL). También puede obtener más información sobre las opciones de resolución de conflictos SQLite aquí: http://www.sqlite.org/conflict.html

2

Puede eliminar not null de la tabla y funcionará correctamente. de esta manera:
derecha:

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

equivocada:

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

No hay nada 'incorrecto' en' NOT NULL' se usa. Indica que un valor no puede ser nulo. – Hobbyist

Cuestiones relacionadas