首页 > 解决方案 > 禁用 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;");

        }
    };

有人可以帮我解决这个问题吗?

标签: androidandroid-sqliteandroid-room

解决方案


RoomDatabase.Callback.onOpen()改为调用它。它需要在框架的 pragma 设置之后。您也不需要super方法覆盖中的调用。


推荐阅读