如何处理基于更改的表名/列的sqlite触发器?

时间:2017-09-05 08:36:46

标签: android sqlite triggers android-sqlite

假设我有这两个表并触发:

CREATE TABLE first_table (
 `text` TEXT,
 `num`  INTEGER,
 `id`   INTEGER
);

CREATE TABLE second_table (
 `text` TEXT,
 `num`  INTEGER,
 `id`   INTEGER
);

CREATE TRIGGER first_table_trigger AFTER INSERT ON first_table
BEGIN
INSERT INTO second_table VALUES('NEW LINE', new.num, new.id);
END;

现在,假设我的android应用程序更改了second_table(添加了一个列或将其名称更改为new_second_table)。 现在first_table_trigger 无限期! 如何在sql数据库中处理这个问题,而不必在应用程序代码中处理这个问题。

我的意思是,我可以在first_table_trigger中动态猜测第二个表名或其列吗?

我只需要从sql / triggers获取解决方案的帮助,而不是代码请求:)

非常感谢。

2 个答案:

答案 0 :(得分:0)

SQLite被设计为嵌入式数据库,与“真实”数据库一起使用。编程语言。

因此,它没有任何内置机制来创建动态SQL。 特别是,表名不能动态更改,但必须在每个SQL语句中按字面写入,并且在编译语句时(实际使用触发器时),语句中的所有表名都必须存在。

答案 1 :(得分:0)

如果您能够将数据库复制到SQLite管理工具(例如SQLite Manager),我相信这需要一个有根设备,或者该应用程序具有将数据库备份到可访问存储位置的内置方法,另外还具有从该存储位置的备份恢复数据库的能力。

然后你可以在复制后在SQLite管理工具中手动修改数据库,例如DROP然后创建触发器,然后将数据库复制回设备,如果设备已植根,则将数据库的原始位置复制到可访问的存储位置,并使用具有备份和还原功能的应用程序。

例如,假设使用Android Studio的Android设备监视器和包含名为todo.db的数据库的mjt.so46027137包,则可以按如下方式提取数据库: -

enter image description here

在此屏幕截图中,添加了2个触发器,并选择了第一个删除:

enter image description here

然后可以推迟更改,例如: -

enter image description here

运行以下内容: -

    SQLiteDatabase db = databaseHelper.getWritableDatabase();
    Cursor csr = db.rawQuery("SELECT * FROM sqlite_master",null);
    while (csr.moveToNext()) {
        Log.d("SQLITEMASTER","Row=" + csr.getPosition());
        String sqlmstr = "";
        for (int i=0; i < csr.getColumnCount(); i++) {
            sqlmstr = sqlmstr + "\n\t" + "Column=" + csr.getColumnName(i) + " Data in Column=" + csr.getString(i);
        }
        Log.d("SQLITEMASTER", sqlmstr);
    }
输出从sqlite_master表中提取的数据的

显示了两个触发器(我实际上没有删除触发器): -

09-06 17:25:56.791 25300-25300/? D/SQLITEMASTER: Row=0
09-06 17:25:56.792 25300-25300/? D/SQLITEMASTER:    Column=type Data in Column=table
                                                    Column=name Data in Column=android_metadata
                                                    Column=tbl_name Data in Column=android_metadata
                                                    Column=rootpage Data in Column=3
                                                    Column=sql Data in Column=CREATE TABLE android_metadata (locale TEXT)
09-06 17:25:56.792 25300-25300/? D/SQLITEMASTER: Row=1
09-06 17:25:56.792 25300-25300/? D/SQLITEMASTER:    Column=type Data in Column=table
                                                    Column=name Data in Column=student
                                                    Column=tbl_name Data in Column=student
                                                    Column=rootpage Data in Column=4
                                                    Column=sql Data in Column=CREATE TABLE student(_id INTEGER PRIMARY KEY AUTOINCREMENT, todo TEXT)
09-06 17:25:56.792 25300-25300/? D/SQLITEMASTER: Row=2
09-06 17:25:56.792 25300-25300/? D/SQLITEMASTER:    Column=type Data in Column=table
                                                    Column=name Data in Column=sqlite_sequence
                                                    Column=tbl_name Data in Column=sqlite_sequence
                                                    Column=rootpage Data in Column=5
                                                    Column=sql Data in Column=CREATE TABLE sqlite_sequence(name,seq)
09-06 17:25:56.792 25300-25300/? D/SQLITEMASTER: Row=3
09-06 17:25:56.792 25300-25300/? D/SQLITEMASTER:    Column=type Data in Column=trigger
                                                    Column=name Data in Column=test001
                                                    Column=tbl_name Data in Column=student
                                                    Column=rootpage Data in Column=0
                                                    Column=sql Data in Column=CREATE TRIGGER "test001" AFTER INSERT ON "student" BEGIN INSERT INTO student VALUES('ghost'); END
09-06 17:25:56.792 25300-25300/? D/SQLITEMASTER: Row=4
09-06 17:25:56.792 25300-25300/? D/SQLITEMASTER:    Column=type Data in Column=trigger
                                                    Column=name Data in Column=test002
                                                    Column=tbl_name Data in Column=student
                                                    Column=rootpage Data in Column=0
                                                    Column=sql Data in Column=CREATE TRIGGER "test002" AFTER INSERT ON "student" BEGIN Insert INTO student VALUES('ghost2'); END

因此确认已添加触发器。

以上示例是使用Genymotion(仿真)设备完成的。