如何在SQLite android中多次执行触发器?

如何在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中插入了一行 有人能帮我实现这个目标吗。任何帮助都将不胜感激一种可能的

我正在开发一个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;