Intereting Posts

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

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

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

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

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

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

Спасибо.

Solutions Collecting From Web of "Использование SQLite Trigger для обновления поля «LastModified»"

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

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

Наконец, использование триггера, подобного этому, является самым простым способом, который я знаю для поддержания last_accessed времени 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 вам необходимо создать триггер для каждого типа действий. Другими словами, вы не можете использовать:

 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 .)