Отключить PRAGMA recursive_triggers - PullRequest
       14

Отключить PRAGMA recursive_triggers

0 голосов
/ 06 декабря 2018

В документации для Android * указано, что PRAGMA recursive_triggers включен по умолчанию:

По умолчанию все базы данных RoomDatabase используют в памяти для таблиц TEMP и включают рекурсивные триггеры.

Это вызывает у меня проблемы, когда я использую вставку с «onConflict (REPLACE)»: если (и только если) recursice_triggers разрешено, это вызывает мой триггер onDelete (см. Документация SQLite ):

REPLACE [...] Когда стратегия разрешения конфликтов REPLACE удаляет строки для удовлетворения ограничения, триггеры delete запускаются тогда и только тогда, когда включены рекурсивные триггеры. [...]

Я пытался отключить это, добавив 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;");

        }
    };

Может кто-нибудь помочь мне сэто?

1 Ответ

0 голосов
/ 06 декабря 2018

Назовите это вместо RoomDatabase.Callback.onOpen().Это должно прийти после установки прагмы фреймворка.Вам также не нужны вызовы super в переопределениях вашего метода.

...