Не удается выполнить миграцию Android из не комнатной версии в зашифрованную комнату (с SafeRoom) - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть приложение с несколькими миграциями, одно из которых - от версии, предшествующей использованию Room, до версии, когда Room был представлен. Я обнаружил, что он работает с обратным вызовом RoomOpenHelper.onUpgrade, но когда я использую SafeHelperFactory, он создает экземпляр SQLiteOpenHelper, который сам содержит обратный вызов RoomOpenHelper. Я думаю, что это создает конфликты на пути миграции. Странно то, что эта проблема не возникает, когда я перехожу из версии приложения, в которой уже есть Room (без шифрования), в версию с SafeRoom, она также работает без проблем при миграции из комнаты без Room (без шифрования). ,Получаемая мной трассировка стека следующая (хотя я не уверен, сколько контекста для миграции понадобится, я не думаю, что сама миграция является проблемой, так как она работает при миграции из комнаты в комнату и работает дляв то время как проблема возникает, когда я пытаюсь ввести SafeRoom, пожалуйста, посмотрите порядок выполнения вызовов функций / методов).

Process: com.xx.xx.debug, PID: 16780
    net.sqlcipher.database.SQLiteException: error in view guest_summary: no such table: main.my_guests: ALTER TABLE my_guests_temp RENAME TO my_guests
        at net.sqlcipher.database.SQLiteDatabase.native_execSQL(Native Method)
        at net.sqlcipher.database.SQLiteDatabase.execSQL(SQLiteDatabase.java:2417)
        at com.commonsware.cwac.saferoom.Database.execSQL(Database.java:371)
        at MyDatabaseKt$MIGRATION_15_16$1.migrate(MyDatabase.kt:460)
        at androidx.room.RoomOpenHelper.onUpgrade(RoomOpenHelper.java:87)
        at com.commonsware.cwac.saferoom.Helper$OpenHelper.onUpgrade(Helper.java:207)
        at net.sqlcipher.database.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:182)
        at com.commonsware.cwac.saferoom.Helper$OpenHelper.getWritableSupportDatabase(Helper.java:172)
        at com.commonsware.cwac.saferoom.Helper.getWritableDatabase(Helper.java:82)
        at androidx.room.RoomDatabase.query(RoomDatabase.java:256)
        at androidx.room.util.DBUtil.query(DBUtil.java:54)

Версия без места - 15. Я использую Dagger такспособ, которым я интегрирую SafeRoom, выглядит следующим образом.

    /**
     * Provide the single instance of our room database
     */
    @Singleton
    @Provides
    fun provideDatabase(@Named("app") context: Context): MyDatabase {
        val databaseState = SQLCipherUtils.getDatabaseState(context, "DatabaseName.db")
        Log.d("ROOM", "database status: $databaseState")
        if (databaseState == SQLCipherUtils.State.UNENCRYPTED) {
            Log.d("ROOM", "start encryption")
            val passphrase = "databasekey".toCharArray()
            SQLCipherUtils.encrypt(context, "DatabaseName.db", passphrase)
            Log.d("ROOM", "finish encryption")
        }

        val factory = SafeHelperFactory.fromUser(SpannableStringBuilder("databasekey"))

        return Room
                .databaseBuilder(
                        app,
                        MyDatabase::class.java,
                        "DatabaseName.db"
                )
                .openHelperFactory(factory)
                .allowMainThreadQueries()
                .addMigrations(*getMigrationList())
                .build()
    }

Если требуется больше контекста, я могу предоставить. Если это известная проблема или уже есть работоспособное решение, пожалуйста, перенаправьте меня. Спасибо.

...