10

これは設計上の問題の方が多いかもしれませんが、ここで説明します。私は、MySQLデータベースと時々同期するローカルSQLiteデータベース(複数のテーブルを含む)を使用するAndroidアプリを作成しています。データベース内の変更された行のみを更新したい。これを行うために、各行に列 " last_modified"を追加して、その行が追加/更新/置換された時刻などを示します。

私はデータベース操作に不慣れですが、トリガーがこれを行うための最良の方法である可能性があることを確認しました。トリガー、SQLite、Androidに関していくつか質問があります。

私はこのリンクを読みました:SQLiteでcurrent_timestampを更新するときそれは基本的に私が正しいアプローチを使用していることを示しています。私の質問は次のとおりです。

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

または、トリガーが悪い考えである場合、より良い代替手段はありますか?

ありがとうございました。

4

1 に答える 1

26

あなたのための短くて甘い答え:

  1. その後、トリガーには参照する有効なテーブルがあります。
  2. 影響を受けるテーブルと列の組み合わせごとにCREATETRIGGERを実行する必要があります。別のテーブルに、このテーブルが同じように動作するようにする列があるため、データベースは想定last_modifiedしません...
  3. リンクのトリガーは実行可能です(私は自分で使用しました)。テーブル/列の名前を変更するだけです。

最後に、このようなトリガーを使用することは、私が知っている最も簡単な方法であり、タイムスタンプを維持last_modifiedすることができます。last_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のWebサイトによると、アクションの種類ごとにトリガーを作成する必要があります。つまり、次のものは使用できません。

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

于 2012-05-29T18:55:20.783 に答える