2012-05-29 66 views
9

這可能是一個更多的設計問題,但這裏有。我正在編寫一個Android應用程序,它使用本地SQLite數據庫(具有多個表),每隔一段時間就與MySQL數據庫同步。我只想更新數據庫中的修改行。爲此,我在每行添加一列「last_modified」,表示該行被添加/更新/替換/等的時間。使用SQLite觸發器來更新「LastModified」字段

我是新來的數據庫操作,但我看到,觸發器可能是最好的方式來做到這一點。我有幾個有關觸發器,SQLite和Android的問題。

我讀過這個鏈接:on update current_timestamp with SQLite它基本上說我正在使用正確的方法。我的問題是:

  1. 我應該在哪裏放db.execSQL("CREATE TRIGGER...")聲明?在創建表之前還是之後?
  2. 我可以爲我的數據庫中的每個表使用相同的觸發器嗎?即觸發器是否可以自動檢測哪個表和行正被更新/插入/替換/等等。並通知設置該行的「last_modified」字段,還是必須爲每個表創建單獨的觸發器?
  3. 由於我對數據庫操作相當陌生,您能否提供一個示例Android觸發器語句來執行上述行爲,或者爲示例提供資源?

或者如果觸發器是一個壞主意,有沒有更好的選擇?

謝謝。

回答

25

爲您簡明扼要的回答:

  1. 後,所以觸發器具有有效的表引用。
  2. 您需要爲您想要影響的每個表/列組合執行CREATE TRIGGER。數據庫不會假設,因爲另一個表有一個last_modified列,你希望這個行爲相同...
  3. 鏈接中的觸發器是可執行的(我自己使用它),只需更改表/列名。

最後,使用觸發器一樣,這是最簡單的方式我知道維持last_modifiedlast_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列中。)

+0

看起來不錯!謝謝。那麼在你的例子中,「TIME」是你的「last_modified」字段,「ID」就是每行的primary_id字段? – jmhend

+0

還有一個問題。有沒有辦法在UPDATEing和INSERTing上觸發相同的觸發器? – jmhend

+1

或者不是有一個用於INSERT的觸發器,只是將「last_modified」的DEFAULT值設爲CURRENT_TIMESTAMP,呃? – jmhend