我如何 运行 在房间数据库中触发?
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;
结果将是:-
即:-
- 插入 test001 行不会通过触发器执行任何操作,因为它的 CreatedDate 已超过 10 天。
- 插入 test002 行会导致行被触发器删除,因为它的 CreatedDate 还不到 10 天。
- 插入 test003 行导致行被触发器删除,因为它的 CreatedDate 还不到 10 天。
- 插入 test004 行不会通过触发器执行任何操作,因为它的 CreatedDate 已超过 10 天。
- 插入 test005 行导致行被触发器删除,因为它的 CreatedDate 还不到 10 天。
- 插入 test006 行不会通过触发器执行任何操作,因为它的 CreatedDate 不是有效的日期格式(因此 date(创建日期)returns 空)。
- test007 行的插入不会通过触发器执行任何操作,因为它的 CreatedDate 不是有效的日期格式(因此 date(创建日期)returns 空)。
使用SELECT * FROM sqlite_master WHERE type = 'trigger';
可以查看触发器是否存在。输出将沿线(只是突出显示的行):-
我尝试以这种方式实现触发器 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;
结果将是:-
即:-
- 插入 test001 行不会通过触发器执行任何操作,因为它的 CreatedDate 已超过 10 天。
- 插入 test002 行会导致行被触发器删除,因为它的 CreatedDate 还不到 10 天。
- 插入 test003 行导致行被触发器删除,因为它的 CreatedDate 还不到 10 天。
- 插入 test004 行不会通过触发器执行任何操作,因为它的 CreatedDate 已超过 10 天。
- 插入 test005 行导致行被触发器删除,因为它的 CreatedDate 还不到 10 天。
- 插入 test006 行不会通过触发器执行任何操作,因为它的 CreatedDate 不是有效的日期格式(因此 date(创建日期)returns 空)。
- test007 行的插入不会通过触发器执行任何操作,因为它的 CreatedDate 不是有效的日期格式(因此 date(创建日期)returns 空)。
使用SELECT * FROM sqlite_master WHERE type = 'trigger';
可以查看触发器是否存在。输出将沿线(只是突出显示的行):-