SQLiteException:没有这样的 table:数据库注释(代码 1 SQLITE_ERROR)

SQLiteException: no such table: database-notes (code 1 SQLITE_ERROR)

我正在尝试迁移新的数据库版本。唯一改变的是添加了一列。我总是收到以下错误:

android.database.sqlite.SQLiteException: no such table: database-notes (code 1 SQLITE_ERROR): , while compiling: ALTER TABLE 'database-notes' ADD COLUMN image TEXT

我不明白为什么会出现此异常,因为我的 table 在 .build() 调用中被命名为 database-notes

这是我的数据库class:

@Database(
version = 2,
entities = [Note::class],
exportSchema = true)

abstract class AppDatabase : RoomDatabase() {
abstract fun noteDao(): NoteDAO

companion object {
    fun build(context: Context) = Room.databaseBuilder(context, AppDatabase::class.java, "database-notes")
        .addMigrations(MIGRATION_1_2).build()
    }
}

val MIGRATION_1_2 = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
       database.execSQL("ALTER TABLE 'database-notes' ADD COLUMN image TEXT")
    }
}

数据库名称与之前的版本完全一致。我复制它以排除错别字。 我在这里忽略了什么?提前致谢!

because my table is named database-notes

由于失败,它似乎不是,并且可能是对数据库名称和 table 名称之间的区别的误解。

一个数据库可以有多个table。数据库名称是文件本身的名称(tables、索引、视图和触发器等组件的容器)。

在您的代码 database-notes 中,根据第 3 个参数,Room.databaseBuilder 是数据库(文件)的名称。

对于 Room,table 名称派生自 classes,它们都使用 @Entity 注释并通过 @Database 注释的实体参数提供。在你的情况下 Note class.

table 的名称将是 Note,除非您使用 @Entity 注释的 tableName = 参数提供另一个名称。

例子

如果以下是你的备注 class :-

@Entity // No tableName parameter so the table name is the class name
data class Note(
    @PrimaryKey
    var noteId: Long? = null,
    var noteText: String,
    var image: String
)

则table名称为(class的名称)

如果注释 class 是:-

@Entity(tableName = "notes") //<<<<< specifically names the table
data class Note(
    @PrimaryKey
    var noteId: Long? = null,
    var noteText: String,
    var image: String
)

table 名称将是 notes(由 @Entity 注释的 tableName = 参数指定)。