这可能更像是一个设计问题,但这里有。我正在编写一个Android应用程序,该应用程序使用本地SQLite数据库(具有多个表),并且每隔一段时间就与MySQL数据库同步。我只想更新数据库中的修改行。为此,我在每行添加一列“last_modified
”,表示添加/更新/替换/等行的时间。
我是数据库操作的新手,但我已经看到触发器可能是最好的方法。我有几个与Triggers,SQLite和Android相关的问题。
我已经阅读了这个链接:on update current_timestamp with SQLite它基本上说我正在使用正确的方法。我的问题是:
db.execSQL("CREATE TRIGGER...")
声明?在我创建表之前或之后?last_modified
”字段,或者是否必须为每个表创建单独的触发器?或者如果触发器是一个坏主意,还有更好的选择吗?
谢谢。
答案 0 :(得分:25)
给你一个简短而又甜蜜的答案:
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
列的默认增量值。)