Android: SQLite Contrainte échec de la question
Dans mon application, j'utilise une base de données SQLite. Lors de l'insertion de données dans une de mes tables, je suis confronté bizarre question de "SQLite exception: erreur de 19". Pour la première fois des données est insérée mais, lorsque j'essaie d'insérer les données de nouveau, elle lève une exception.
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");
Requête D'Insertion:
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
}
Voici 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 nombre de postes mais n'a pas obtenu beaucoup d'aide.
- si tu veux mettre à jour les données existent déjà?
- Non, je veux insérer de nouvelles données à chaque fois. Est-il quelque chose de mal dans la syntaxe?
- Il vous suffit d'insérer une nouvelle ligne?
- Oui, je veux insérer une nouvelle ligne
- Placer un point d'arrêt sur l'instruction insert. Inspecter
values
. Est-il contenir de valeurs null? - J'ai vérifié toutes les valeurs, elles ne sont pas nulles. Est-il possible de savoir sur quelle contrainte de panne?
- Alors la seule chose que je peux penser, c'est que n ° de commande n'est pas unique.
- Oui, il ne l'est pas. Pour le même numéro de commande, il peut y avoir plusieurs billets. Donc, est-il un autre moyen pour accomplir cette?
- Que faire si je veux avoir le code de résultat de l'insertion? J'ai cherché partout et je ne peut pas obtenir une réponse. Je veux faire l'insertion et de vérifier ensuite le code de résultat. Dans ce cas, il serait de 19 (ou SQLITE_CONSTRAINT). Comment puis-je obtenir ce code?
Vous devez vous connecter pour publier un commentaire.
Il y a 2 façons de résoudre votre problème.
Première:
Déclarer
PRIMARY KEY
commeautoincrement
Deuxième:
Lorsque vous tentez d'insérer une nouvelle ligne,
provide different/unique ID
de la nouvelle ligne.Pour tester, s'il vous plaît
DELETE DATABASE
avant d'exécuter à nouveau votre application.SOLUTION:
Cette ligne doit être:
au lieu de
NULL
? Peut-être, qui pourrait être le problème.NOT NULL
vous ne pouvez pas mettre pas les valeurs null, mais si vous mettez rien que vous pouvez mettre même les valeurs null ou pas les valeurs null.autoincrement
pour ID. Il devrait fonctionner+ "ID integer PRIMARY KEY AUTOINCREMENT,"
attention vous n'êtes pas à l'insertion de valeurs null où vous ne pouvez pas. Pouvez-vous avoir un accès direct à la db? Juste à lire l'ID et quelques autres données stockées première fois. Je recommande d'utiliser l'applicationroot browser
NOT NULL
de clé primaire et où jamais déclaré. Mais, son calme étrange. J'ai environ 12 de table dans ma base de données ayant la même définition, mais aucun n'a causé des ennuis à l'exception de celui-ci.Vous obtenez contrainte a échoué parce que vous avez enfreint la contrainte de mettre sur le terrain, comme passer d'une valeur null dans une colonne que vous déclarez comme not null lorsque vous créez votre table.
Je pense que
"ID integer PRIMARY KEY NOT NULL,"
cela pose le problème, assurez-vous qu'il estautoincrement
et les autres valeurs ne sont pas nulles que vous mettez la contrainte not null.si vous utilisez des ID int Valeur que
"ID integer PRIMARY KEY AUTOINCREMENT"
au lieu de
"ID integer PRIMARY KEY not NULL"
si vous utilisez l'ID de la Chaîne de Valeur de
utiliser en dessous de la ligne à insérer la valeur
db.insertWithOnConflict(TABLE_NAME, null,valeurs,SQLiteDatabase.CONFLICT_IGNORE);
(Où les valeurs est ovject de ContentValues objet)
au lieu de
db.insert(TABLE_NAME, null, valeurs);
garder de codage....sourire...