Комната не может проверить целостность данных при повторном открытии приложения - PullRequest
0 голосов
/ 26 мая 2020

Я учусь использовать Room из Codelabs , и теперь у меня есть две таблицы

, когда я запускаю Android Studio нормальная

, но когда я закрываю и снова открываю приложение, я получил ошибку

java .lang.IllegalStateException: Room не может проверить целостность данных. Похоже, вы изменили схему, но забыли обновить номер версии. Вы можете просто исправить это, увеличив номер версии.

ошибка при повторном открытии приложения , а не при установке

Я пытаюсь обновить номер версии и у меня все еще есть ошибка

здесь мой код

@Database(entities = [Type::class], version = 3)
abstract class TypeRoomDb : RoomDatabase(){

    abstract fun typeDao() : TypeDao

    companion object{
        @Volatile
        private var INSTANCE : TypeRoomDb? = null

        fun getDataBase(
            context: Context,
            scope: CoroutineScope
        ): TypeRoomDb {
            return INSTANCE ?: synchronized(this){
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    TypeRoomDb::class.java,
                    Cons.DB_NAME
                )
                    .fallbackToDestructiveMigration()
                    .addCallback(TypeDbCallBack(scope))
                    .build()
                INSTANCE = instance

                instance
            }
        }

        private class TypeDbCallBack(
            private val scope: CoroutineScope
        ) : RoomDatabase.Callback(){
            override fun onOpen(db: SupportSQLiteDatabase) {
                super.onOpen(db)
                INSTANCE?.let { database ->
                    scope.launch(Dispatchers.IO) {
                        populateDb(
                            database.typeDao()
                        )
                    }
                }
            }
        }

        fun populateDb(typeDao: TypeDao){
            typeDao.deleteAll()
            /*out*/
            typeDao.insert(
                Type(
                    "000",
                    "Makan",
                    0
                )
            )
            typeDao.insert(
                Type(
                    "001",
                    "Transportasi",
                    0
                )
            )
            typeDao.insert(
                Type(
                    "002",
                    "Makanan Ringan",
                    0
                )
            )
            typeDao.insert(
                Type(
                    "003",
                    "Komunikasi",
                    0
                )
            )

            /*in*/
            typeDao.insert(Type(
                "500",
                "Gaji",
                1))
            typeDao.insert(
                Type(
                    "5001",
                    "Hadiah",
                    1
                )
            )
        }

    }
}

моя вторая таблица

@Database(entities = [LogKeuangan::class], version = 2)
abstract class LogKeuanganRoomDb : RoomDatabase() {
    abstract fun logKeuanganDao(): LogKeuanganDao

    companion object {
        @Volatile
        private var INSTANCE: LogKeuanganRoomDb? = null

        fun getDataBase(
            context: Context,
            scope: CoroutineScope
        ): LogKeuanganRoomDb {
            return INSTANCE ?: synchronized(this) {
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    LogKeuanganRoomDb::class.java,
                    Cons.DB_NAME
                )
                    .fallbackToDestructiveMigration()
                    .build()

                INSTANCE = instance
                instance
            }
        }

    }
}

Ответы [ 3 ]

1 голос
/ 26 мая 2020

Если вы изменили схему, вам потребуется предоставить классы миграции для обновления существующих данных в соответствии со схемой:

https://developer.android.com/training/data-storage/room/migrating-db-versions

//EXAMPLE TAKEN DIRECTLY FROM THE LINK SUPPLIED:

val MIGRATION_1_2 = object : Migration(1, 2) {
    override fun migrate(database: SupportSQLiteDatabase) {
        database.execSQL("CREATE TABLE `Fruit` (`id` INTEGER, `name` TEXT, " +
                "PRIMARY KEY(`id`))")
    }
}

val MIGRATION_2_3 = object : Migration(2, 3) {
    override fun migrate(database: SupportSQLiteDatabase) {
        database.execSQL("ALTER TABLE Book ADD COLUMN pub_year INTEGER")
    }
}

Room.databaseBuilder(applicationContext, MyDb::class.java, "database-name")
        .addMigrations(MIGRATION_1_2, MIGRATION_2_3).build()

Вы также можете удалить приложение вручную перед повторной установкой с изменениями БД, и тогда вам не придется беспокоиться о миграции, пока приложение не будет опубликовано.

1 голос
/ 26 мая 2020

Все, что четко указано в

java .lang.IllegalStateException: Room не может проверить целостность данных. Похоже, вы изменили схему, но забыли обновить номер версии. Вы можете просто исправить это, увеличив номер версии.

Все, что вам нужно, это увеличить версию и установить exportSchema на false

с

@Database(entities = [Type::class], version = 3)
* От 1013 * до
@Database(entities = [Type::class], version = 4, exportSchema = false)

Примечание

@ База данных создает еще одну базу данных, если вы хотите, чтобы все таблицы принадлежали одной базе данных, а затем включите их в одну базу данных. вы не должны создавать новую базу данных для каждой таблицы

0 голосов
/ 26 мая 2020

благодаря Джасурбеку

Я удалил свой второй класс RoomDatabase и добавил свою вторую таблицу к объектам

, и все готово

@Database(entities = [Type::class, LogKeuangan::class], version = 3)
abstract class TypeRoomDb : RoomDatabase(){

    abstract fun typeDao() : TypeDao
    abstract fun logKeuanganDao() : LogKeuanganDao
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...