2010-07-30 6 views
4

j'ai deux albums tableaux et chansons et chaque chanson a référence à l'identifiant de l'alun.contrainte sqlite échoué code d'erreur

table Album:

CREATE TABLE albums 
(id INTEGER PRIMARY KEY ASC, 
name TEXT, 
additional TEXT) 

table chanson:

CREATE TABLE songs 
(id INTEGER PRIMARY KEY ASC, 
album_fk INTEGER NOT NULL, 
title TEXT, 
url TEXT, 
duration BIGINT NOT NULL) 

et j'ai aussi un déclencheur pour vérifier si je supprime un album s'il y a des chansons qu'il y trouve:

CREATE TRIGGER trigger_on_delete 
BEFORE DELETE ON albums 
FOR EACH ROW BEGIN 
SELECT RAISE(FAIL,'album has songs cannot be deleted') 
WHERE (SELECT album_fk FROM songs WHERE album_fk = OLD.id) IS NOT 
NULL;) 
END 

tout cela fonctionne très bien, mais parfois

Exception: android.database.sqlite.SQLiteConstraintException: error 
code 19: constraint failed 
Stack Trace : 
android.database.sqlite.SQLiteStatement.native_execute(Native Method) 
android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java: 
66) 

est levée lorsque je tente de supprimer un album. Ma méthode de suppression est simplement la suppression d'un album par ID. La mauvaise chose est que je ne peux pas reproduire cela, donc il n'y a pas beaucoup d'informations que je peux fournir. J'ai essayé différents scénarios avec la suppression d'un album mais je n'ai jamais eu cette exception.

donc des idées comment enquêter sur cette question. Il n'y a pas de contraintes dans la table des albums, alors qu'est-ce qui pourrait causer une telle exception? Toute aide serait appréciée.

+0

Tout d'abord, je vous recommande de télécharger le navigateur de base de données SQLite. Ce logiciel offre la possibilité de tester vos requêtes après les avoir exportées de l'émulateur. De cette façon, vous pouvez vérifier s'il y a une erreur. En outre, juste après que vous élevez la fonction, vous avez un; mais il semble couper votre requête dans le middl parce qu'il est suivi d'un où – Sephy

+0

La première fois que vous avez créé votre table, était sans aucune contrainte car il est dans votre poste? Si vous exécutez pour la première fois avec des contraintes, la table sera créée. Ensuite, si vous supprimez la contrainte et re-exécuter votre projet, la table ne sera pas recréé (si vous utilisez seulement getWrtiableDatabase()) et vous aurez l'ancienne version (avec la contrainte). Donc vous devrez d'abord le supprimer. – ccheneson

Répondre

2

Il en est ainsi pas juste. Si vous exécutez ce code sur PC tout est OK et si vous essayez de supprimer l'album qui a des chansons l'exception dit: l'album a des chansons ne peuvent pas être supprimés », mais il semble que les gars android ne gèrent pas RAISE correcte de sqlite et jsut jet Exception: android.database.sqlite.SQLiteConstraintException: code d'erreur 19:. contrainte n'a pas

1

J'ai eu le même problème avec certains déclencheurs dans la backgroung , je me suis finalement passé à cette option classique et fixe mon problème:

db.rawQuery ("Mettre à Jour colonne set de table = newValue WHERE ...; ", null);

2

Je résolu ce problème en corrigeant la définition de ma base de données à un champ qui est NOT NULL. Vous devez envoyer des données.