这可能更像是一个设计问题,但这里是。我正在编写一个 Android 应用程序,它使用本地 SQLite 数据库(具有多个表),不时与 MySQL 数据库同步。我只想更新数据库中修改过的行。为此,我向每一行添加了一个列“last_modified
”,以指示添加/更新/替换/等该行的时间。
我是数据库操作的新手,但我发现触发器可能是执行此操作的最佳方式。我有几个与触发器、SQLite 和 Android 有关的问题。
我已阅读此链接:on update current_timestamp with SQLite它基本上说我正在使用正确的方法。我的问题是:
- 我应该在哪里放置
db.execSQL("CREATE 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 - 使用 SQLite 触发器更新 "LastModified"字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10804892/