使用SQLite Trigger更新"LastModified"字段

jmh*_*end 10 sqlite android triggers

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

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

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

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

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

谢谢.

Sam*_*Sam 25

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

  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";
Run Code Online (Sandbox Code Playgroud)

加成

根据SQLite网站,您需要为每种类型的操作创建触发器.换句话说,你不能使用:

CREATE TRIGGER trigger_name 
  AFTER UPDATE, INSERT ...
Run Code Online (Sandbox Code Playgroud)

根据您的上一条评论,您可能已经找到了为我们的目的处理INSERT语句的最佳方法:

CREATE TABLE foo (
  _id INTEGER PRIMARY KEY,
  last_modified TIMESTAMP NOT NULL DEFAULT current_timstamp);
Run Code Online (Sandbox Code Playgroud)

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