如何在SQLite android中多次执行触发器?
我正在开发一个android应用程序,它实现了SQLite数据库,我想创建一个触发器,在达到utill specificcount时运行多次 需要什么 表1和表2共有两个表 在表1上插入后,触发器应被调用12次,并且 根据特定WHERE子句在表2中插入12行 第13次 触发器不应插入任何新行。 我试过的 DatabaseHelper类中的onOpen函数 DatabaseHelper类中的onCreate函数 输出:它只在表2中插入了一行如何在SQLite android中多次执行触发器?,android,triggers,android-sqlite,android-database,Android,Triggers,Android Sqlite,Android Database,我正在开发一个android应用程序,它实现了SQLite数据库,我想创建一个触发器,在达到utill specificcount时运行多次 需要什么 表1和表2共有两个表 在表1上插入后,触发器应被调用12次,并且 根据特定WHERE子句在表2中插入12行 第13次 触发器不应插入任何新行。 我试过的 DatabaseHelper类中的onOpen函数 DatabaseHelper类中的onCreate函数 输出:它只在表2中插入了一行 有人能帮我实现这个目标吗。任何帮助都将不胜感激一种可能的
有人能帮我实现这个目标吗。任何帮助都将不胜感激一种可能的解决方案是使用触发器,但您必须小心,我不确定使用递归触发器解决此类问题是否是一种好的做法 您的代码无法工作,因为您对表1调用了一次触发器,它在表2中执行了一次插入,仅此而已 但是,请检查下面的代码段。我在表2中添加了另一个触发器,它将同一行插入11次
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("PRAGMA recursive_triggers = ON;\n");
db.execSQL("CREATE TABLE TABLE1 (NAME VARCHAR(20))");
db.execSQL("CREATE TABLE TABLE2 (COL1 NUMBER, COL2 NUMBER)");
db.execSQL("CREATE TRIGGER multi_insertion_table1 BEFORE INSERT ON TABLE1 \n" +
" WHEN (SELECT COUNT (*) from TABLE2 where COL1=1 and COL2=2) < 12\n" +
" BEGIN \n" +
" insert into TABLE2 values (1, 2); \n " +
" END;");
db.execSQL("CREATE TRIGGER multi_insertion_table2 AFTER INSERT ON TABLE2 \n" +
" WHEN (SELECT COUNT (*) from TABLE2 where COL1=1 and COL2=2) < 12\n" +
" BEGIN \n" +
" insert into TABLE2 values (1, 2); \n " +
" END;");
}
在这种情况下,第二个触发器必须是AFTER语句,否则DB将抛出一个异常,并显示一条触发递归级别过多的消息。请检查此项。我认为您的问题不是您的触发器在理论上是错误的,而是您有3个表:- 表1, 表2和 BN\U MS\U LS\U时间表 您将从表2中获得行数,但将其插入BN\u MS\u LS\u计划中 这个答案是基于表1中的12个插入触发12次,而不是表1中插入后的解释a触发器应调用12次并插入12行,这意味着在插入表1中的第一行时应插入12行,如果这是要求,则您可以:- 可以使用带有多组值的单个插入,例如插入BN_MS_LS_附表第1列、第2列的值“001”、“002”、“003”、“004”。。。。。。 或在BEGIN中使用12个INSERT语句/操作。。。。结束构造给定示例显示了这样的多个2语句/操作 猜测一下,您需要执行以下操作:-
public void onCreate(SQLiteDatabase db) {
createTables(db);
db.execSQL("CREATE TRIGGER multi_insertion AFTER INSERT ON TABLE1 " +
" WHEN (SELECT COUNT (*) from TABLE2 where MYNUMBER=1) < 12" +
" BEGIN " +
" INSERT into BN_MS_LS_SCHEDULE (COLUMN1,COLUMN2) VALUES ('001','002');" +
" INSERT into TABLE2 VALUES(?????????); " + //<<<<<<<<< insert a row into table 2 to act as a counter
" END;");
}
后果
在中运行上述结果:-
表1,即插入的所有18行
表2
突出显示的列显示从表1检索的数据
可以看出,只添加了12行
BN\U MS\U LS\U时间表
同样,只添加了12行
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("PRAGMA recursive_triggers = ON;\n");
db.execSQL("CREATE TABLE TABLE1 (NAME VARCHAR(20))");
db.execSQL("CREATE TABLE TABLE2 (COL1 NUMBER, COL2 NUMBER)");
db.execSQL("CREATE TRIGGER multi_insertion_table1 BEFORE INSERT ON TABLE1 \n" +
" WHEN (SELECT COUNT (*) from TABLE2 where COL1=1 and COL2=2) < 12\n" +
" BEGIN \n" +
" insert into TABLE2 values (1, 2); \n " +
" END;");
db.execSQL("CREATE TRIGGER multi_insertion_table2 AFTER INSERT ON TABLE2 \n" +
" WHEN (SELECT COUNT (*) from TABLE2 where COL1=1 and COL2=2) < 12\n" +
" BEGIN \n" +
" insert into TABLE2 values (1, 2); \n " +
" END;");
}
public void onCreate(SQLiteDatabase db) {
createTables(db);
db.execSQL("CREATE TRIGGER multi_insertion AFTER INSERT ON TABLE1 " +
" WHEN (SELECT COUNT (*) from TABLE2 where MYNUMBER=1) < 12" +
" BEGIN " +
" INSERT into BN_MS_LS_SCHEDULE (COLUMN1,COLUMN2) VALUES ('001','002');" +
" INSERT into TABLE2 VALUES(?????????); " + //<<<<<<<<< insert a row into table 2 to act as a counter
" END;");
}
DROP TABLE IF EXISTS table1;
DROP TABLE IF EXISTS table2;
DROP TABLE IF EXISTS BN_MS_LS_SCHEDULE;
DROP TRIGGER IF EXISTS multi_insertion;
CREATE TABLE IF NOT EXISTS table1 (mydata);
CREATE TABLE IF NOT EXISTS table2 (mynumber,valuefromtable1);
CREATE TABLE IF NOT EXISTS BN_MS_LS_SCHEDULE (COLUMN1,COLUMN2,OTHERCOLUMNS);
CREATE TRIGGER IF NOT EXISTS multi_insertion
AFTER INSERT ON table1
WHEN (SELECT COUNT (*) from TABLE2 where MYNUMBER=1) < 12
BEGIN
INSERT INTO table2 VALUES(1,new.mydata /* record value that caused insert */); /*<<<<<<<<<< ADDED TO TRIGGER >>>>>>>>>>*/
INSERT into BN_MS_LS_SCHEDULE (COLUMN1,COLUMN2) VALUES ('001','002');
END;
/* Add some testing data which will exceed the 12 rows */
INSERT INTO table1 VALUES('a');
INSERT INTO table1 VALUES('b');
INSERT INTO table1 VALUES('c');
INSERT INTO table1 VALUES('d');
INSERT INTO table1 VALUES('e');
INSERT INTO table1 VALUES('f');
INSERT INTO table1 VALUES('g');
INSERT INTO table1 VALUES('h');
INSERT INTO table1 VALUES('i');
INSERT INTO table1 VALUES('j');
INSERT INTO table1 VALUES('k');
INSERT INTO table1 VALUES('l');
INSERT INTO table1 VALUES('m');
INSERT INTO table1 VALUES('n');
INSERT INTO table1 VALUES('o');
INSERT INTO table1 VALUES('p');
INSERT INTO table1 VALUES('q');
INSERT INTO table1 VALUES('r');
/* Results */
SELECT * FROM table1;
SELECT * FROM table2;
SELECT * FROM BN_MS_LS_SCHEDULE;
/* Cleanup Text Environment */
DROP TABLE IF EXISTS table1;
DROP TABLE IF EXISTS table2;
DROP TABLE IF EXISTS BN_MS_LS_SCHEDULE;
DROP TRIGGER IF EXISTS multi_insertion;