发生UPDATE时,SQL时间戳不会更改

时间:2012-08-17 21:43:54

标签: android sqlite timestamp sql-update android-contentprovider

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

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 列的时间戳?

1 个答案:

答案 0 :(得分:1)

您可以让数据库通过设置触发器来处理它:

未经测试...

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;");