6 votes

Les triggers SQLite dans Android ?

Je veux forcer une clé étrangère constarint sur une table dans une application Android.

J'ai cherché à savoir si cela pouvait être fait en utilisant des déclencheurs :

Je l'ai fait comme ça :

db.execSQL("CREATE TRIGGER dept_id_trigger22+" +
                " AFTER INSERT "+
                " OF EmployeeName ON Employees"+
                " BEGIN"+
                                     //Condition
                " RAISE(ABORT,'error') END;");

mais aucune erreur n'a été soulevée et les valeurs illégales sont insérées.

Quel est le problème ?

6voto

Mina Samy Points 3207

Ok, je l'ai eu.

Android prend en charge les déclencheurs SQLite.

La syntaxe correcte est

db.execSQL("CREATE TRIGGER dept_id_trigger22" + 
                " AFTER INSERT "+ 
                "ON Employees"+ 
                " BEGIN"+ 
                                     //Condition 
                " SELECT RAISE(ABORT,'error'); END;"); 

J'ai oublié d'ajouter un point-virgule après l'instruction raise.

Cela n'exécute pas l'instruction mais ne lève pas d'exception. Je vais encore chercher comment lever des exceptions

merci

3voto

Dan Points 1144

Les clés étrangères ne sont supportées que sur Android Froyo (2.2) ou plus récent, pour les versions précédentes vous pouvez les inclure mais SQLite les ignore. Toutes les versions Android de SQLite supportent les triggers pour produire le même effet.

Les versions plus récentes de SQLite (pour votre PC) ont une commande appelée "genfkey" qui analysera votre base de données SQLite (qui contient des clés étrangères) et produira les déclencheurs équivalents. De cette façon, vous pouvez concevoir vos tables avec des contraintes de clés étrangères tout en supportant toutes les versions du système d'exploitation.

Sous Windows, ouvrez l'outil de ligne de commande SQLite avec votre fichier de base de données comme paramètre :

sqlite3 mydatabase.db
.genfkey --exec

Cela va générer des déclencheurs pour toutes vos contraintes clés.

1voto

Thomas Mueller Points 18666

Je n'attends pas de vote pour cette réponse, mais je tiens à vous le faire savoir :

Vous pouvez utiliser une autre base de données, par exemple la Base de données H2 . Avertissement : je suis l'auteur principal de H2.

Il y a quelques inconvénients : certaines opérations (pas toutes) sont plus lentes, par exemple l'ouverture et la fermeture d'une base de données. Le fichier jar est relativement volumineux (environ 1 Mo). Vous devrez utiliser l'API JDBC.

Mais l'avantage est : H2 supporte l'utilisation de déclencheurs, de contraintes, etc.

1voto

Sudhir Patil Points 31

Pour supprimer les 50 dernières lignes lorsque le compte est supérieur à 100

sqliteDB.execSQL("CREATE TRIGGER IF NOT EXISTS delete_trigger
    AFTER INSERT ON table1 
    WHEN (SELECT COUNT(*) FROM table1) > 50 " +
    BEGIN
       delete From table1 where id not in(select id from table1 order by id desc limit 100;
    END;"
);

0voto

mreichelt Points 6217

J'ai découvert que la version de SQLite utilisée ne prend pas en charge les clés étrangères - je suppose donc que les déclencheurs ne sont pas pris en charge non plus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X