android - 禁用 PRAGMA recursive_triggers

标签 android android-sqlite android-room

android room documentation声明 PRAGMA recursive_triggers 默认启用:

By default, all RoomDatabases use in memory storage for TEMP tables and enables recursive triggers.

当我将插入与“onConflict(REPLACE)”一起使用时,这会给我带来问题:如果(且仅当)启用 recursice_triggers,这会触发我的 onDelete 触发器(请参阅 SQLite Documentation):

REPLACE [...] When the REPLACE conflict resolution strategy deletes rows in order to satisfy a constraint, delete triggers fire if and only if recursive triggers are enabled.[...]

我试图通过在 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;");

        }
    };

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

最佳答案

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

关于android - 禁用 PRAGMA recursive_triggers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53648573/

相关文章:

java - Android:调用时 View 返回 null?

android - 更新到 ADT 23 后找不到 annotations.jar

android - 将 SQLite 数据库从 sdcard 导入到 android - 没有 Assets 文件夹

android - 如何在 RoomDatabase 中存储 Enum 的 ArrayList

android - 如何在 Room 中映射 NUMERIC SQLite 类型?

android - android root(/)如何使用系统分区上的 'mount'程序将系统分区挂载到/system上?

java - 在应用程序关闭后保持广播接收器运行

java - 如果数据存在于其他表中则插入到表中

java - 即使应用成功地从 Assets 文件夹打开数据库,也没有找到这样的表

android - 将 kotlin 协程与 room 一起使用