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

前端之家收集整理的这篇文章主要介绍了android – 使用SQLite触发器来更新“LastModified”字段前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这可能更多的是一个设计问题,但是在这里.我正在编写一个 Android应用程序,该应用程序使用与MysqL数据库同步的本地sqlite数据库(具有多个表).我只想更新数据库中的修改行.为了做到这一点,我在每一行中添加一列“last_modified”,这些列表示该行被添加/更新/替换/等等的时间.

我是数据库操作的新手,但是我看到触发器可能是最好的方法.我有几个有关触发器,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列.)

猜你在找的Android相关文章