假设我有这两个表并触发:
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获取解决方案的帮助,而不是代码请求:)
非常感谢。
答案 0 :(得分:0)
SQLite被设计为嵌入式数据库,与“真实”数据库一起使用。编程语言。
因此,它没有任何内置机制来创建动态SQL。 特别是,表名不能动态更改,但必须在每个SQL语句中按字面写入,并且在编译语句时(实际使用触发器时),语句中的所有表名都必须存在。
答案 1 :(得分:0)
如果您能够将数据库复制到SQLite管理工具(例如SQLite Manager),我相信这需要一个有根设备,或者该应用程序具有将数据库备份到可访问存储位置的内置方法,另外还具有从该存储位置的备份恢复数据库的能力。
然后你可以在复制后在SQLite管理工具中手动修改数据库,例如DROP然后创建触发器,然后将数据库复制回设备,如果设备已植根,则将数据库的原始位置复制到可访问的存储位置,并使用具有备份和还原功能的应用程序。
例如,假设使用Android Studio的Android设备监视器和包含名为todo.db的数据库的mjt.so46027137包,则可以按如下方式提取数据库: -
在此屏幕截图中,添加了2个触发器,并选择了第一个删除:
然后可以推迟更改,例如: -
运行以下内容: -
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(仿真)设备完成的。