使用SQLite触发器来更新“LastModified”字段

这可能是更多的devise问题,但是在这里。 我正在编写一个Android应用程序,它使用本地SQLite数据库(具有多个表),每隔一段时间就会同步一个MySQL数据库。 我只想更新我的数据库中的修改行。 为此,我在每行添加一个“ last_modified ”列,表示该行被添加/更新/replace/等的时间。

我是数据库操作的新手,但我已经看到,触发器可能是最好的方式来做到这一点。 我有几个有关触发器,SQLite和Android的问题。

我读过这个链接: 更新current_timestamp与SQLite它基本上说,我使用正确的方法。 我的问题是:

  1. 我应该把db.execSQL("CREATE TRIGGER...")语句放在哪里? 在创build表之前还是之后?
  2. 我可以使用相同的触发器为我的数据库中的每个表? 即触发器是否可以自动检测哪个表和行正被更新/插入/replace/等等。 并通知设置该行的“ last_modified ”字段,或者我必须为每个表创build一个单独的触发器?
  3. 由于我对数据库操作相当陌生,您能否提供一个示例Android触发器语句来执行上述行为,或者为示例提供资源?

或者如果触发器是一个坏主意,有没有更好的select?

谢谢。

Solutions Collecting From Web of "使用SQLite触发器来更新“LastModified”字段"

给你一个简短而甜蜜的回答:

  1. 之后,所以触发器有一个有效的表格来引用。
  2. 您需要为每个要影响的表/列组合执行CREATE TRIGGER。 数据库不会假设,因为另一个表有一个last_modified列,你希望这个行为相同…
  3. 链接中的触发器是可执行的(我自己使用它),只需更改表/列名称即可。

最后,使用这样的触发器是我知道维护last_modifiedlast_accessed时间戳最简单的方法。

我的触发器(以java的forms):

 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网站,您需要为每种types的操作创build一个触发器。 换句话说,你不能使用:

 CREATE TRIGGER trigger_name AFTER UPDATE, INSERT ... 

从您的最后一条评论中,您可能已经find了处理INSERT语句的最佳方法:

 CREATE TABLE foo ( _id INTEGER PRIMARY KEY, last_modified TIMESTAMP NOT NULL DEFAULT current_timstamp); 

在这个表中,你不需要为INSERT语句创build一个时间戳触发器,因为它已经完成了。 (有趣的事实: INTEGER PRIMARY KEY隐式地将AUTOINCREMENT NOT NULL以及默认的增量值添加到我们的_id列。)