4

我在资产文件夹中有一个 .db 文件。我的 RoomDatabase 类如下。我将应用程序安装到我的设备上。然后我在下面的类中更改了 version = 2,并使我的预填充数据库版本为 2。然后我重命名了表中的一列,以便更改架构。然后我再次安装了该应用程序。和繁荣!Room 给我以下错误: Room 无法验证数据完整性。看起来您已更改架构但忘记更新版本号。您可以通过增加版本号来解决此问题。

@Database(entities = [Word::class], version = 1, exportSchema = false)
abstract class WordRoomDatabase : RoomDatabase() {

    abstract fun wordDao(): WordDao

    companion object {

        @Volatile
        private var INSTANCE: WordRoomDatabase? = null

        fun getDatabase(context: Context): WordRoomDatabase =
                INSTANCE ?: synchronized(this) {
                    INSTANCE ?: buildDatabase(context).also { INSTANCE = it }
                }

        
        private fun buildDatabase(ctx: Context): WordRoomDatabase {
            val passphrase: ByteArray = SQLiteDatabase.getBytes("my password".toCharArray())
            val factory = SupportFactory(passphrase)

            return Room.databaseBuilder(ctx.applicationContext, WordRoomDatabase::class.java, "word_database2.db")
                    .openHelperFactory(factory)
                    .createFromAsset("word_database.db")
                    .fallbackToDestructiveMigration()
                    .build()
        }
    }
}

在此之后,我完全删除了我的应用程序。制作预填充的数据库版本和@Database 版本 1。我在 AndroidManifest.xml 中将 allowBackup 设为 false。所以我的设备中不存在数据库。但是当我将应用程序安装到设备时,我仍然面临同样的错误。这是什么胡说八道的错误。我该如何解决?

4

1 回答 1

0

我在不久的过去遇到了同样的问题。我引用http://www.sqlite.org/lang_altertable.html

SQLite 支持有限的 ALTER TABLE 子集。SQLite 中的 ALTER TABLE 命令允许用户重命名表或向现有表添加新列。无法重命名列、删除列或在表中添加或删除约束。

或者,您可以创建一个新表并用旧表的数据填充新表。

我要说的最后一点也是最重要的一点是,如果您想更改 assets 文件夹中存在的 .db 文件的架构,那么您应该使用 sqlite 命令行来执行此操作。当我尝试使用 sqlite db 浏览器更改架构时,它不像你说的那样工作。sqlite db 浏览器中存在用于更改架构的问题。

因此,如果您想更改架构,请在 sqlite 命令行中进行。

在代码和 .db 中增加 .pragma 版本(您可以使用 db browser for sqlite 增加 .pragma)。

为了在不更改架构的情况下添加删除添加数据,您可以安全地继续使用 sqlite db 浏览器。

于 2020-11-18T10:10:03.573 回答