android - 禁用 PRAGMA recursive_triggers
问题描述
android 房间文档指出 PRAGMA recursive_triggers 默认启用:
默认情况下,所有 RoomDatabases 都在内存存储中用于 TEMP 表并启用递归触发器。
当我将插入与“onConflict(REPLACE)”一起使用时,这会给我带来问题:如果(且仅当)recursice_triggers 启用,这会触发我的 onDelete 触发器(请参阅SQLite 文档):
REPLACE [...] 当 REPLACE 冲突解决策略删除行以满足约束时,当且仅当启用递归触发器时,删除触发器才会触发。[...]
我试图通过添加db.execSQL("PRAGMA recursive_triggers = 0;");
RoomDatabase.Callback.onCreate() 来禁用它,但这没有任何效果。
public static synchronized FnsDatabase getInstance(Context context){
if (instance == null) {
instance = Room.databaseBuilder(context, MyDb.class, "mydb.db")
.addCallback(triggerCallback)
.build();
}
return instance;
}
private static RoomDatabase.Callback triggerCallback = new RoomDatabase.Callback(){
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
// adding some triggers here
db.execSQL("PRAGMA recursive_triggers = 0;");
}
};
有人可以帮我解决这个问题吗?
解决方案
RoomDatabase.Callback.onOpen()
改为调用它。它需要在框架的 pragma 设置之后。您也不需要super
方法覆盖中的调用。
推荐阅读
- react-native - React Native 中的自动链接依赖项
- android - Sony Bravia TV KD-55AF8:安装 HTML5 应用程序?
- julia - 如何在 Julia-1.2.0-1 中加载 PyPlot 包
- c - 可以通过重新编译将“libc”移动到另一个系统吗?
- asp.net-core - 在使用 WebApplicationFactory 进行集成测试期间,Serilog 控制台输出不显示
- python - 我对变量的字节大小有疑问
- android - 在 Kotlin 中按 ID 查找按钮
- python - 使用 Python 从多个文件夹中提取所有文件
- c - 我们必须如何声明一个结构?
- swiftui - 使用 SwitUI 执行操作后如何转到特定的选项卡视图?