android room documentation指出PRAGMA recursive_triggers默认是启用的:
默认情况下,所有RoomDatabase都在TEMP表的内存存储中使用并启用递归触发器。
当我将插入与“ onConflict(REPLACE)”一起使用时,这会给我带来问题:如果(且仅当)启用recursice_triggers时,这会触发我的onDelete触发器(请参见SQLite Documentation):
替换[...] 当REPLACE冲突解决策略为了满足约束条件而删除行时,delete仅当且仅当触发 启用了递归触发器。[...]
我试图通过在RoomDatabase.Callback.onCreate()中添加db.execSQL("PRAGMA recursive_triggers = 0;");
来禁用此功能,但这没有任何效果。
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;");
}
};
有人可以帮我吗?
答案 0 :(得分:1)
改为在RoomDatabase.Callback.onOpen()
中调用它。它需要遵循框架的实用性设置。您也不需要在方法覆盖中进行super
调用。