使用SQLite Trigger更新“LastModified”字段

时间:2012-05-29 18:46:52

标签: android sqlite triggers

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

我是数据库操作的新手,但我已经看到触发器可能是最好的方法。我有几个与Triggers,SQLite和Android相关的问题。

我已经阅读了这个链接:on update current_timestamp with SQLite它基本上说我正在使用正确的方法。我的问题是:

  1. 我应该在哪里发表db.execSQL("CREATE TRIGGER...")声明?在我创建表之前或之后?
  2. 我可以为数据库中的每个表使用相同的触发器吗?即,触发器是否可以自动检测正在更新/插入/替换哪个表和行/等。并通知设置该行的“last_modified”字段,或者是否必须为每个表创建单独的触发器?
  3. 由于我对数据库操作不熟悉,您是否可以提供执行上述行为的示例Android Trigger语句,或者为示例提供资源?
  4. 或者如果触发器是一个坏主意,还有更好的选择吗?

    谢谢。

1 个答案:

答案 0 :(得分:25)

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

  1. 之后,所以触发器有一个有效的参考表。
  2. 您需要为要受影响的每个表/列组合执行CREATE TRIGGER。数据库不会假设,因为另一个表有一个last_modified列,您希望这个列的行为相同......
  3. 链接中的触发器是可执行的(我自己使用它),只需更改表/列名称。
  4. 最后,使用这样的触发器是我知道的最简单方式,以维持last_modifiedlast_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列的默认增量值。)