Android 发生更新时,SQL时间戳不会更改

Android 发生更新时,SQL时间戳不会更改,android,sqlite,timestamp,sql-update,android-contentprovider,Android,Sqlite,Timestamp,Sql Update,Android Contentprovider,我使用以下SQL命令在Android客户端上创建products表 CREATE TABLE IF NOT EXISTS 'products' ( '_id' INTEGER PRIMARY KEY AUTOINCREMENT, 'name' TEXT, 'serverId' INTEGER, 'modifiedAt' TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE ( 'serverId' ) ON CONFLICT REPLA

我使用以下SQL命令在Android客户端上创建products表

CREATE TABLE IF NOT EXISTS 'products' (
  '_id' INTEGER PRIMARY KEY AUTOINCREMENT,
  'name' TEXT,
  'serverId' INTEGER, 
  'modifiedAt' TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
  UNIQUE ( 'serverId' ) 
ON CONFLICT REPLACE );
当我从服务器加载数据并将其插入本地数据库时,我在内容提供程序中使用以下命令来更新行或插入新值

public int bulkInsert(Uri uri, ContentValues[] values) {
    final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
    long rowId;
    int rowsAdded = 0;
    for (ContentValues contentValues : values) {
        int affectedRows = db.update("products", contentValues, 
                "serverId = ?", 
                new String[] { contentValues.getAsString("serverId") });
        if (affectedRows == 0) {
            rowId = db.insert("products", null, contentValues);
            if (rowId > 0) {
                rowsAdded++;
            }
        }
    }
    return rowsAdded;
}
当存在新值时,所有列都会更新,但modifiedAt列除外。
注意:批量命令被包装到事务中。为了使问题简单,我省略了代码

问题:


如何在每次更新时更新modifiedAt列的时间戳?

您可以通过设置触发器让数据库处理该问题:

未经测试的

database.execSQL("CREATE TRIGGER updateLastModifiedDate " +
     "AFTER INSERT ON products FOR EACH ROW BEGIN " +
     "UPDATE products SET modifiedAt = date('now') " +
     "WHERE _id = NEW.id " +
     "END;");

database.execSQL("CREATE TRIGGER updateLastModifiedDate " +
     "AFTER UPDATE ON products FOR EACH ROW BEGIN " +
     "UPDATE products SET modifiedAt = date('now') " +
     "WHERE _id = NEW.id " +
     "END;");

插入时不需要触发器,因为默认情况下已经完成了插入,如果我没有弄错的话,时间戳是
datetime('now')
。正如@zapl所注意到的,我应该将批量命令包装到事务中。我这样做了,但为了问题的简单性,省略了相关的代码。现在,如果我在每次更新时都运行触发器:这不会破坏事务的感觉吗:I/O性能?@jdr88实际上,我使用触发器时遇到了负面的性能结果,正如我在中所述。我很高兴听到您的其他意见。@jdr88触发器何时执行?对于已发生的所有更新或事务内的所有更新,在事务完成后,在每次更新之后?@JJD触发器将作为事务的一部分在每次更新行时执行。如果在一次
update
中更新了几行,则在
更新完成之前执行触发器数次。由于触发器添加了必须执行的代码,它们显然会对性能产生负面影响,但通常影响不大。关于事务,您仍然拥有所有修改,包括在单个I/O操作中写入磁盘的触发器。提示:
bulkInsert()
是将插入/更新打包到事务中的好地方。