Использование SQLite Trigger для обновления поля «LastModified»

Это может быть больше вопрос дизайна, но здесь идет. Я пишу приложение для Android, которое использует локальную базу данных SQLite (с несколькими таблицами), которая время от времени синхронизируется с базой данных MySQL. Я только хочу обновить измененные строки в моей базе данных. Для этого я добавляю столбец & quot;last_modified& Quot; к каждой строке, которая указывает время, когда эта строка была добавлена / обновлена / заменена / и т.д.

Я новичок в операциях с базами данных, но я видел, что триггер может быть лучшим способом сделать это. У меня есть пара вопросов, касающихся триггеров, SQLite и Android.

Я прочитал эту ссылку:при обновлении current_timestamp с SQLite В основном это говорит о том, что я использую правильный подход. Мои вопросы:

Where should I put the db.execSQL("CREATE TRIGGER...") statement? Before or after I create the tables? Can I use the same Trigger for every table in my database? i.e, can the Trigger automatically detect which table and row is being updated/inserted/replaced/etc. and notify to set that row's "last_modified" field, or do I have to create a separate Trigger for each table? Since I'm quite new to database operations, could you provide an example Android Trigger statement that performs the above behavior, or provide a resource to an example?

Или, если триггеры - плохая идея, есть ли лучшие альтернативы?

Спасибо.

Ответы на вопрос(1)

Решение Вопроса

После этого у триггера есть действительная таблица для ссылки. Вам нужно выполнить CREATE TRIGGER для каждой комбинации таблицы / столбца, на которую вы хотите повлиять. База данных не будетпредполагат потому что в другой таблице естьlast_modified столбец, который вы хотите, чтобы этот вел себя так же ... Триггер в вашей ссылке исполняемый (я использовал его сам), просто измените имена таблиц / столбцов.

Наконец, используя такой триггер как Простой как я знаю, чтобы поддерживать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";

Сложение

Согласно Вебсайт сайта вам нужно создать триггер для каждого типа действия. Другими словами, выне могу использовать:

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 колонка.)

 jmhend29 мая 2012 г., 22:34
Или вместо триггера для ВСТАВКИ, просто значение DEFAULT для "last_modified" будет CURRENT_TIMESTAMP, а?
 jmhend29 мая 2012 г., 21:14
Выглядит отлично! Спасибо. Итак, в вашем примере «ВРЕМЯ» - это ваше поле «last_modified», а «ИД» - просто поле primary_id для каждой строки?
 jmhend29 мая 2012 г., 21:46
Еще один вопрос. Есть ли способ иметь одну и ту же поддержку триггера при UPDATEing и INSERTing?
 Sam30 мая 2012 г., 01:21
@ jmhend я обновляю свой ответ.

Ваш ответ на вопрос