gpt4 book ai didi

android - 如何在房间数据库中运行触发器?

转载 作者:行者123 更新时间:2023-11-29 00:59:29 24 4
gpt4 key购买 nike

我尝试以这种方式实现触发器 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;

结果将是:-

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) 返回 null)。<
  7. test007 行的插入不会通过触发器执行任何操作,因为它的 CreatedDate 不是有效的日期格式(因此 date(CreatedDate) 返回 null)。<

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

enter image description here

关于android - 如何在房间数据库中运行触发器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52250922/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com