我是数据库操作的新手,但是我看到触发器可能是最好的方法.我有几个有关触发器,sqlite和Android的问题.
我已经阅读了这个链接:on update current_timestamp with SQLite它基本上说我正在使用正确的方法.我的问题是:
>我应该在哪里放db.execsql(“CREATE TRIGGER …”)语句?在创建表之前或之后?
>我可以为我的数据库中的每个表使用相同的Trigger吗?即,触发器可以自动检测哪些表和行正被更新/插入/替换等.并通知设置该行的“last_modified”字段,或者我必须为每个表创建一个单独的触发器?
>由于我对数据库操作非常新鲜,您能否提供一个执行上述行为的示例Android Trigger语句,或者为示例提供资源?
或者如果触发器是一个坏主意,有没有更好的选择?
谢谢.
解决方法
>之后,所以触发器有一个有效的表来引用.
>您需要为您想要影响的每个表/列组合执行CREATE TRIGGER.数据库不会假设,因为另一个表有一个last_modified列,你希望这个行为相同…
>您的链接中的触发器是可执行的(我自己使用它),只需更改表/列名称.
最后,使用这样的触发器是我知道维护last_modified或last_accessed时间戳的最简单的方法.
我的触发器(以java形式):
private static final String UPDATE_TIME_TRIGGER = "CREATE TRIGGER update_time_trigger" + " AFTER UPDATE ON " + TABLE_NAME + " FOR EACH ROW" + " BEGIN " + "UPDATE " + TABLE_NAME + " SET " + TIME + " = current_timestamp" + " WHERE " + ID + " = old." + ID + ";" + " END";
加成
根据SQLite website,您需要为每种类型的操作创建一个触发器.换句话说,你不能使用:
CREATE TRIGGER trigger_name AFTER UPDATE,INSERT ...
从您最近的评论中,您可能已经想出了处理INSERT语句的最佳方法:
CREATE TABLE foo ( _id INTEGER PRIMARY KEY,last_modified TIMESTAMP NOT NULL DEFAULT current_timstamp);
在此表中,您不需要为INSERT语句创建时间戳触发器,因为已经完成. (有趣的是:INTEGER PRIMARY KEY隐式地将AUTOINCREMENT NOT NULL以及默认的增量值添加到我们的_id列.)