10

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

我是数据库操作的新手,但我已经看到触发器可能是执行此操作的最佳方法。我有几个关于触发器、SQLite 和 Android 的问题。

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

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

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

谢谢你。

4

1 回答 1

26

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

  1. 之后,触发器有一个有效的表可供参考。
  2. 您需要为要影响的每个表/列组合执行 CREATE TRIGGER。数据库不会假设,因为另一个表有一个last_modified列,您希望该列的行为相同......
  3. 您链接中的触发器是可执行的(我自己使用过),只需更改表/列名。

最后,使用这样的触发器是我知道的最简单的维护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 网站,您需要为每种类型的操作创建一个触发器。换句话说,您不能使用:

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列。)

于 2012-05-29T18:55:20.783 回答