禁用PRAGMA recursive_triggers

时间:2018-12-06 09:49:48

标签: android android-sqlite android-room

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;");

        }
    };

有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

改为在RoomDatabase.Callback.onOpen()中调用它。它需要遵循框架的实用性设置。您也不需要在方法覆盖中进行super调用。