2012-05-29 5 views
9

これは設計上の問題の可能性がありますが、ここでは説明します。私は、MySQLデータベースと同期するローカルのSQLiteデータベース(複数のテーブルを持つ)を使用するAndroidアプリケーションを作成しています。私は自分のデータベースの変更された行を更新したいだけです。これを行うには、その行が追加/更新/置き換えられた時刻を示す列「last_modified」を各行に追加します。SQLiteトリガーを使用して "LastModified"フィールドを更新する

私はデータベース操作が初めてですが、これを実行するにはトリガーが最適であるかもしれません。私は、トリガー、SQLite、およびAndroidに関連するいくつかの質問があります。

私はこのリンクを読んでいます:on update current_timestamp with SQLite基本的に私は正しいアプローチを使用していると言います。私の質問は次のとおりです:

  1. db.execSQL("CREATE TRIGGER...")の声明はどこに貼り付けますか?テーブルを作成する前または後で?
  2. データベース内のすべてのテーブルに対して同じトリガを使用できますか?すなわち、トリガーは、どのテーブルおよび行が更新/挿入/置換/等されているかを自動的に検出することができる。その行の "last_modified"フィールドを設定するように通知するか、各テーブルに対して個別のトリガーを作成する必要がありますか?
  3. 私はデータベース操作が新しくなっているので、上記の動作を実行するサンプルAndroid Trigger文を提供できますか、またはリソースをサンプルに提供できますか?

トリガーが悪い考えである場合は、より良い選択肢がありますか?

ありがとうございます。

答えて

25

あなたのために短いと甘い答え:

  1. した後、そのトリガーは、参照に有効なテーブルを持っています。
  2. 影響を受けるすべてのテーブル/列の組み合わせに対してCREATE TRIGGERを実行する必要があります。データベースはとなり、となるでしょう。別のテーブルには同じものを動作させたいlast_modifiedの列があるからです...
  3. あなたのリンクのトリガーは実行可能です(私はそれを使いました)。名前。

最後には、次のようにトリガーを使用すると、last_modifiedまたはlast_accessedタイムスタンプを維持するために私が知っている最も簡単な方法です。 (Javaの形で)

マイトリガー:あなたは、アクションの種類ごとにトリガを作成する必要がSQLite websiteによると

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

追加

。言い換えれば、あなたことができません使用:

CREATE TRIGGER trigger_name 
    AFTER UPDATE, INSERT ... 

あなたの最後のコメントから、あなたが私たちの目的のためにINSERT文を処理するための最善の方法を考え出したことがあります。この表で

CREATE TABLE foo (
    _id INTEGER PRIMARY KEY, 
    last_modified TIMESTAMP NOT NULL DEFAULT current_timstamp); 

を、あなたはすでに完了しているので、INSERTステートメントのタイムスタンプトリガーを作成する必要はありません。 (Funファクト:INTEGER PRIMARY KEYAUTOINCREMENT NOT NULLとデフォルトの増分値を暗黙的に_id列に追加します)

+0

素晴らしいですね!ありがとうございました。したがって、あなたの例では、 "TIME"は "last_modified"フィールドで、 "ID"は各行のprimary_idフィールドです。 – jmhend

+0

もう1つ質問があります。 UPDATEとINSERTの両方で同じトリガーサポートをトリガーする方法はありますか? – jmhend

+1

または、INSERTのためのトリガーを持つ代わりに、 "last_modified"のDEFAULT値をCURRENT_TIMESTAMPにするだけですか? – jmhend

関連する問題