Как запустить триггер в базе данных комнат? - PullRequest
0 голосов
/ 10 сентября 2018

Я попытался реализовать триггер onCallBack () таким образом, но он не выдает ошибку и не работает.

 private static Callback sRoomDatabaseCallback = new Callback(){

    @Override
    public void onOpen (@NonNull SupportSQLiteDatabase db){
        super.onOpen(db);
        // If you want to keep the data through app restarts,
        // new PopulateDbAsync(INSTANCE).execute();
        // You can run trigger for database house keeping jobs directly here
        db.execSQL("Create Trigger IF NOT EXISTS "+DbConfig.Trigr_NewsAnnouncementDelete +
                " After Insert On " + DbConfig.Tbl_NewsAnnouncement+
                " Begin Delete From "+DbConfig.Tbl_NewsAnnouncement +
                " WHERE DATE(CreatedDate) > DATE('now','-10 days');" +
                " END ");
    }
};

Во время отладки я обнаружил, что NewsAnnouncementDatabase_Impl.java (автоматически созданный файл) имеет следующие строки кода

    @SuppressWarnings("unchecked")
    public class NewsAnnouncementDatabase_Impl extends NewsAnnouncementDatabase 
    {
      private volatile NewsAnnouncementDao _newsAnnouncementDao;

      private volatile DatabaseHouseKeepingDao _databaseHouseKeepingDao;

      @Override
      protected SupportSQLiteOpenHelper createOpenHelper(DatabaseConfiguration configuration) {
        final SupportSQLiteOpenHelper.Callback _openCallback = new RoomOpenHelper(configuration, new RoomOpenHelper.Delegate(1) {
          @Override
          public void createAllTables(SupportSQLiteDatabase _db) {
            _db.execSQL("CREATE TABLE IF NOT EXISTS `NewsAnnouncement` (`Id` TEXT NOT NULL, `Title` TEXT, `Image` TEXT, `Description` TEXT, `PublishDate` TEXT, `CreatedDate` TEXT, `UserName` TEXT, `ShortDescription` TEXT, PRIMARY KEY(`Id`))");

.....
...
}

Может ли кто-нибудь помочь мне выяснить проблему в моем синтаксисе триггера или в любой другой идее. Я пытаюсь удалить записи последних 10 дней из базы данных, используя триггер.

Спасибо.

1 Ответ

0 голосов
/ 11 сентября 2018

Синтаксис триггера выглядит нормально и работает (см. Ниже), хотя логика удаления всех строк, дата создания которых превышает 10 дней назад, может привести к удалению вставленной строки, если только дата создания этой строки не равна 10 дням или больше в прошлом.

Чтобы сработал триггер, значение, хранящееся в столбце CreatedDate, должно быть в приемлемом формате даты, т. Е. Гггг-мм-гг (например, 2018-09-11).

Рассмотрим следующее (тестовая версия вашего SQL с данными): -

DROP TABLE IF EXISTS NewsAnnouncement;
DROP TRIGGER IF EXISTS Trigr_NewsAnnouncementDelete;
CREATE TABLE IF NOT EXISTS `NewsAnnouncement` (`Id` TEXT NOT NULL, `Title` TEXT, `Image` TEXT, `Description` TEXT, `PublishDate` TEXT, `CreatedDate` TEXT, `UserName` TEXT, `ShortDescription` TEXT, PRIMARY KEY(`Id`));

SELECT * FROM NewsAnnouncement;

Create Trigger IF NOT EXISTS Trigr_NewsAnnouncementDelete 
    AFTER Insert On NewsAnnouncement
    Begin Delete From NewsAnnouncement 
        WHERE DATE(CreatedDate) > DATE('now','-10 days');
  END
;

SELECT * FROM sqlite_master WHERE type = 'trigger';

INSERT INTO NewsAnnouncement VALUES
    ('test001','title001','image001','desc001','2018-01-01','2018-01-01','fred','shordesc001'),
    ('test002','title002','image002','desc002','2018-10-01','2018-10-01','fred','shordesc002'),
    ('test003','title003','image003','desc003','2018-12-01','2018-12-01','fred','shordesc003'),
    ('test004','title004','image004','desc004','2018-08-01','2018-08-01','fred','shordesc004'),
    ('test005','title005','image005','desc005','2018-12-01','2018-12-01','fred','shordesc005'),
    ('test006','title006','image006','desc006','2018/08/01','2018/08/01','fred','shordesc006'),
    ('test007','title007','image007','desc007','2018/12/01','2018/12/01','fred','shordesc007')
;

SELECT *,date(CreatedDate) FROM NewsAnnouncement;

Результат будет: -

enter image description here

То есть: -

  1. Вставка строки test001 через триггер ничего не делает, так как CreatedDate старше 10 дней.
  2. Вставка строки test002 приводит к удалению строки триггером, так как ее CreatedDate меньше 10 дней.
  3. Вставка строки test003 приводит к удалению строки триггером, так как CreatedDate имеет возраст менее 10 дней.
  4. Вставка строки test004 через Триггер ничего не делает, так как CreatedDate старше 10 дней.
  5. Вставка строки test005 приводит к удалению строки триггером, так как ее CreatedDate меньше 10 дней.
  6. Вставка строки test006 ничего не делает с помощью триггера, поскольку CreatedDate не является допустимым форматом даты (таким образом, date (CreatedDate) возвращает ноль).
  7. Вставка строки test007 через триггер ничего не делает, так как CreatedDate не является допустимым форматом даты (таким образом, date (CreatedDate) возвращает ноль).

Использование SELECT * FROM sqlite_master WHERE type = 'trigger'; может использоваться для проверки существования триггера. Вывод будет выглядеть следующим образом (только выделенная строка): -

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...