使用Room数据库(Room Persistence Library)创建触发器

12

如何使用Room Persistence库"创建触发器"

CREATE TRIGGER  IF NOT EXISTS delete_till_10 INSERT ON user WHEN (select count(*) from user)>9

BEGIN 

    DELETE FROM user WHERE id IN  (SELECT id FROM user ORDER BY id limit (select count(*) -9 from user));

END

Room抽象了原始的SQL语句。你应该处理对象。 - CL.
1个回答

17
调用RoomDatabase上的getOpenHelper()。这将会给你一个SupportSQLiteOpenHelper,它具有类似于SQLiteOpenHelper的 API。在此上面,调用getWritableDatabase()以获取SupportSQLiteDatabase,并使用其中的execSQL()来执行 SQL 语句。一个 RoomDatabase.Callback 是一个可以执行此类 SQL 的地方,正如 AdamMc331 在 this Kotlin snippet 中所说明的。
换句话说,Room 无法真正帮助您解决这种情况,但您总是可以使用更低级别的数据库 API 来处理这种情况。

你有关于我们应该何时进行这个操作的建议吗?触发器只能被创建一次,因此我会认为在房间迁移中进行这个操作是很好的,但想听听你的意见。 - AdamMc331
此外,即使我在迁移中完成了它,我应该在哪里定义触发器,以便在首次安装应用程序时应用它? - AdamMc331
3
@AdamMc331说:“我不知道如何进行数据库的初始创建迁移。因此,虽然你需要使用迁移来更新现有应用程序,但是对于初始创建,你需要在其他地方执行。这可能是 RoomDatabase.Callback 的一个使用案例;你可以在 onCreate() 中创建触发器。你可以通过 RoomDatabase.Builder 上的 addCallbacks() 方法附加 Callback。” - CommonsWare
5
@CommonsWare 谢谢,这正是我所需要的。我刚刚简单测试了一下,看起来很不错。我已经将相关代码放在 gist 上,供任何可能遇到此问题的人使用,请随意将其添加到你的答案中 - https://gist.github.com/AdamMc331/5d48220875ce6b8bf0a0c0396ec8a0c0 - AdamMc331

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接