我如何 运行 在房间数据库中触发?

How can I run trigger in Room Database?

我尝试以这种方式实现触发器 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 天的记录。

谢谢。

触发器语法看起来很好并且有效(见下文),尽管删除创建日期大于 10 天前的所有行的逻辑可能会导致插入的行被删除,除非该行的创建日期是过去 10 天或更长时间。

要使触发器正常工作,存储在 CreatedDate 列中的值必须采用可接受的日期格式,即 yyyy-mm-yy(例如 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;

结果将是:-

即:-

  1. 插入 test001 行不会通过触发器执行任何操作,因为它的 CreatedDate 已超过 10 天。
  2. 插入 test002 行会导致行被触发器删除,因为它的 CreatedDate 还不到 10 天。
  3. 插入 test003 行导致行被触发器删除,因为它的 CreatedDate 还不到 10 天。
  4. 插入 test004 行不会通过触发器执行任何操作,因为它的 CreatedDate 已超过 10 天。
  5. 插入 test005 行导致行被触发器删除,因为它的 CreatedDate 还不到 10 天。
  6. 插入 test006 行不会通过触发器执行任何操作,因为它的 CreatedDate 不是有效的日期格式(因此 date(创建日期)returns 空)。
  7. test007 行的插入不会通过触发器执行任何操作,因为它的 CreatedDate 不是有效的日期格式(因此 date(创建日期)returns 空)。

使用SELECT * FROM sqlite_master WHERE type = 'trigger';可以查看触发器是否存在。输出将沿线(只是突出显示的行):-