2012-05-29 2 views
9

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

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

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

  1. Куда я могу поместить заявление db.execSQL("CREATE TRIGGER...")? До или после создания таблиц?
  2. Могу ли я использовать тот же триггер для каждой таблицы в моей базе данных? т. е. может ли Trigger автоматически определять, какая таблица и строка обновляется/вставлена ​​/ заменена/и т. д. и уведомлять, чтобы установить поле «last_modified» этой строки, или мне нужно создать отдельный триггер для каждой таблицы?
  3. Поскольку я новичок в операциях с базой данных, вы можете представить пример оператора Android Trigger, который выполняет описанное выше поведение, или предоставить ресурс примеру?

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

спасибо.

ответ

25

Короткий и сладкий ответ для вас:

  1. После, поэтому триггер имеет действительную таблицу для ссылки.
  2. Вам необходимо выполнить CREATE TRIGGER для каждой комбинации таблиц и столбцов, которые вы хотите затронуть. База данных не будет предположить, потому что в другой таблице есть столбец 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 website вам необходимо создать триггер для каждого типа действия.Другими словами, вы не можете использование:

CREATE TRIGGER trigger_name 
    AFTER UPDATE, INSERT ... 

Из последнего комментария вы можете выяснял лучший способ справиться оператор INSERT для нашей цели:

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

В этой таблице, не нужно создавать триггер timestamp для инструкции INSERT, поскольку это уже сделано. (Забавный факт: INTEGER PRIMARY KEY неявно добавляет AUTOINCREMENT NOT NULL, а также значение по умолчанию для нашего столбца _id.)

+0

Выглядит отлично! Спасибо. Итак, в вашем примере «TIME» - ваше поле «last_modified», а «ID» - это только поле primary_id для каждой строки? – jmhend

+0

Еще один вопрос. Есть ли способ активировать ту же поддержку триггера как для UPDATE, так и для INSERTing? – jmhend

+1

Или вместо того, чтобы иметь триггер для INSERTING, просто значение DEFAULT для «last_modified» должно быть CURRENT_TIMESTAMP, а? – jmhend