2013-09-08 10 views
1

Dans mon application, j'utilise la base de données SQLite. Lors de l'insertion de données dans l'une de mes tables, je suis confronté à un problème étrange de "SQLite exception: error 19". Pour la première fois, les données sont insérées mais, lorsque j'essaie d'insérer à nouveau des données, elles génèrent une exception.Android: problème lié à SQLite Contrainte

Mon create table requête:

"CREATE TABLE Tickets (" 
      + "ID integer PRIMARY KEY NOT NULL," 
      + " UID varchar(40) NOT NULL DEFAULT 'not available'," + " OrderID int NOT NULL," 
      + " CarrierTicketNum varchar(15) NOT NULL," 
      + " TicketTypeID int NOT NULL," + " TankTypeID int NULL," 
      + " ProductObsGravity numeric NULL DEFAULT 0," 
      + " ProductHighTemp numeric NULL DEFAULT 0," 
      + " ProductLowTemp numeric NULL DEFAULT 0," 
      + " ProductObsTemp numeric NULL DEFAULT 0," 
      + " ProductBSW numeric NULL DEFAULT 0"); 

Insérer une requête:

public void insertTank(int OrderID, int TicketTypeID, 
     String CarrierTicketNum, String TankNum, int TankTypeID, 
     Double ProductObsTemp, Double ProductObsGravity, Double ProductBSW, 
     Double GrossBarrels, Double NetBarrels) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
    values.put("OrderID", OrderID); 
    values.put("CarrierTicketNum", CarrierTicketNum); 
    values.put("TankNum", TankNum); 
    values.put("TicketTypeID", TicketTypeID); 
    values.put("TankTypeID", TankTypeID); 
    values.put("ProductObsTemp", ProductObsTemp); 
    values.put("ProductObsGravity", ProductObsGravity); 
    values.put("ProductBSW", ProductBSW); 
    values.put("GrossBarrels", GrossBarrels); 
    values.put("NetBarrels", NetBarrels); 
    //try { 
     db.insertOrThrow("Tickets", null, values); 
    /*} catch (SQLiteException sqle) { 
     Log.d(TAG, "SQLITException: " + sqle.getMessage()); 
    }*/ 
    db.close(); // Closing database connection 
} 

ci-après le détail du journal:

09-08 13:54:57.610: E/AndroidRuntime(5713): FATAL EXCEPTION: main 
09-08 13:54:57.610: E/AndroidRuntime(5713): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed 
09-08 13:54:57.610: E/AndroidRuntime(5713):  at android.database.sqlite.SQLiteStatement.native_executeInsert(Native Method) 
09-08 13:54:57.610: E/AndroidRuntime(5713):  at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:113) 
09-08 13:54:57.610: E/AndroidRuntime(5713):  at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1718) 
09-08 13:54:57.610: E/AndroidRuntime(5713):  at android.database.sqlite.SQLiteDatabase.insertOrThrow(SQLiteDatabase.java:1617) 
09-08 13:54:57.610: E/AndroidRuntime(5713):  at com.dzo.dispatchcrude.driverapp.datalayer.DatabaseHandler.insertTank(DatabaseHandler.java:736) 
09-08 13:54:57.610: E/AndroidRuntime(5713):  at com.dzo.dispatchcrude.driverapp.NetBarrelActivity$1.onClick(NetBarrelActivity.java:103) 
09-08 13:54:57.610: E/AndroidRuntime(5713):  at android.view.View.performClick(View.java:3511) 
09-08 13:54:57.610: E/AndroidRuntime(5713):  at android.view.View$PerformClick.run(View.java:14110) 
09-08 13:54:57.610: E/AndroidRuntime(5713):  at android.os.Handler.handleCallback(Handler.java:605) 
09-08 13:54:57.610: E/AndroidRuntime(5713):  at android.os.Handler.dispatchMessage(Handler.java:92) 
09-08 13:54:57.610: E/AndroidRuntime(5713):  at android.os.Looper.loop(Looper.java:137) 
09-08 13:54:57.610: E/AndroidRuntime(5713):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
09-08 13:54:57.610: E/AndroidRuntime(5713):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-08 13:54:57.610: E/AndroidRuntime(5713):  at java.lang.reflect.Method.invoke(Method.java:511) 
09-08 13:54:57.610: E/AndroidRuntime(5713):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
09-08 13:54:57.610: E/AndroidRuntime(5713):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
09-08 13:54:57.610: E/AndroidRuntime(5713):  at 
dalvik.system.NativeStart.main(Native Method) 

Lire presque messages de nombre, mais n » ai pas J'ai beaucoup d'hel p.

+0

Voulez-vous mettre à jour les données déjà existantes? –

+0

Non, je souhaite insérer de nouvelles données à chaque fois. Y a-t-il un problème de syntaxe? – Nitish

+0

Vous avez simplement besoin d'insérer une nouvelle ligne? –

Répondre

9

Il existe deux façons de résoudre votre problème.

Première:

Déclare PRIMARY KEY comme autoincrement

Deuxième:

Lorsque vous essayez d'insérer une nouvelle ligne, provide different/unique ID pour la nouvelle ligne.

Pour le tester, veuillez DELETE DATABASE avant de lancer à nouveau votre application.

SOLUTION: Cette ligne devrait être:

+ "ID integer PRIMARY KEY AUTOINCREMENT," 

au lieu de

+ "ID integer PRIMARY KEY NOT NULL," 
+0

En sqlite, AutoIncrement pour la clé primaire n'est pas nécessaire, non? Bien que, j'ai essayé avec elle mais n'a pas fonctionné. – Nitish

+0

Avez-vous besoin de mettre 'NULL'? Peut-être que cela pourrait être le problème. –

+1

Si vous mettez 'NOT NULL' vous ne pouvez pas mettre des valeurs non nulles, mais si vous ne mettez rien, vous pouvez mettre des valeurs nulles ou non. –

1
android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed 

Vous obtenez la contrainte a échoué parce que vous avez violé la contrainte de mettre sur le terrain, comme le passage une valeur nulle dans une colonne que vous déclarez non nulle lorsque vous créez votre table.

Je pense que "ID integer PRIMARY KEY NOT NULL," cela vous pose problème, assurez-vous qu'il est S'il vous plaît autoincrement et les autres valeurs ne sont pas nulles que vous mettez la contrainte non nulle.

+0

Mais, je ne passe rien dans la clé primaire . J'ai aussi essayé avec l'incrémentation automatique. – Nitish

+0

Mais l'un des UID de champ (s'il vous plaît se référer créer une requête de table) sera mis à jour à partir du serveur lors de la synchronisation, je ne peux rien y mettre. Peut-il être la cause du problème? – Nitish

+0

Vérifiez les données que vous insérez et assurez-vous que deux enregistrements n'ont pas la même clé. –

1

si vous utilisez ID comme int valeur que

"entier ID PRIMARY KEY AUTOINCREMENT"

au lieu de

"ID entier PRIMARY KEY NOT NULL"

si vous utilisez ID en tant que chaîne Valeur que

utilisez la ligne ci-dessous pour insérer la valeur db.insertWithOnConflict (TABLE_NAME, null, valeurs , SQLiteDatabase.CONFLICT_IGNORE);

(Lorsque la valeur est ovject de contentValues ​​objet)

au lieu de

db.insert (TABLE_NAME, null, valeurs); Continuer à coder .... sourire ...