3

次の 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列のタイムスタンプを更新するにはどうすればよいですか?

4

1 に答える 1

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;");
于 2012-08-17T22:52:55.570 に答える