【问题标题】:How can I run trigger in Room Database?如何在房间数据库中运行触发器?
【发布时间】:2018-09-11 05:39:46
【问题描述】:

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

谢谢。

【问题讨论】:

标签: android sqlite android-room android-architecture-components


【解决方案1】:

触发器语法看起来很好并且有效(见下文),尽管删除创建日期大于 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(CreatedDate) 返回 null)。李>
  7. test007 行的插入不会通过触发器执行任何操作,因为它的 CreatedDate 不是有效的日期格式(因此 date(CreatedDate) 返回 null)。李>

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

【讨论】:

    猜你喜欢
    • 2018-01-19
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    相关资源
    最近更新 更多