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 =
参数指定)。
我正在尝试迁移新的数据库版本。唯一改变的是添加了一列。我总是收到以下错误:
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 =
参数指定)。