最近,我决定将我的应用程序从Java重写为静态编程语言。问题是在房间中迁移会返回一个奇怪的异常。
这是我的数据类的一部分
@Entity(tableName = Constants.MOVIE_TABLE)
data class Movie(
@ColumnInfo(name = "adult") var adult: Boolean? = null,
@Ignore @ColumnInfo(name = "backdrop_path") var backdropPath: String? = null,
@ColumnInfo(name = "budget") var budget: Long? = null,
@Ignore var genres: List<MovieGenre>? = emptyList(),
@Ignore var homepage: String? = null,
@PrimaryKey @ColumnInfo(name = "id") var id: Int? = null,
...
@ColumnInfo(name = "vote_average")var voteAverage: Double? = null,
@ColumnInfo(name = "vote_count") var voteCount: Int? = null,
@ColumnInfo(name = "added_date") var addedDate: Date? = null,
@ColumnInfo(name = "my_rating") var myRating: Float? = null
)
注意:我自己没有更改列,因此我的迁移如下所示:
internal val WATCHED_MIGRATION_1_2 = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
}
}
有人能告诉我为什么我看到notNull=true
而不是notNull=false
吗?
提前感谢!
奇怪的例外
不完全是。Room有期望,以便能够使用数据库中的内容构建/使用/映射对象。因此,它会检查现有数据库是否符合它的期望。如果不是,那么它会报告它的期望和发现。
有人能告诉我为什么我看到not Null=true而不是notNull=false吗?
通过指定?
(例如var myRating: Float?=null
)然后Room将其解释为能够为空,因此不为空=false。您在FOUND中看到true的原因是这是要迁移的存在数据库的模式中的内容。
当您从java转换为null时,您必须意识到静态编程语言Int等价于JavaIneteger对象而不是java int。
Java有int、long、boolean等基元。。。。。其中不能为null,它们总是有一个值,因此将被房间标记为非null,因为它们不可为null。
Kotlin没有纯原语对象,因此Kotlin Int等效于java Integer。对象可以为null,因此房间允许它们为null。
修复问题,您可以选择
如果选择选项b),那么我建议,由于您没有添加/删除列,在迁移使用中:-
database.execSQL("DROP TABLE IF EXISTS"常量.MOVIE_TABLE"_old;")
database.execSQL("ALTER TABLE"常量。MOVIE_TABLE"RENAME TO"常量。MOVIE_TABLE"_old;"
database.exeSQL("从生成的JAVA复制的创建表语句")
database.exeSQL("INSERT INTO"常量。MOVIE_TABLE"SELECT*From"常量。MOVIE_TABLE"_old;")
database.execSQL("DROP TABLE IF EXISTS"常量.MOVIE_TABLE"_old;")
database.execSQL("VACUUM;")
笔记
我正在使用2.4.0-ALPHA01房间
并且我发现了基于数据库版本4的可能场景的迁移varargs。 我的问题是,假设我使用的是db v1的Room,当我的应用程序到达db v10时,我将不得不编写多少迁移方法? 在sqlite中,我们在中获得已安装应用程序的当前db版本,我们只需通过开关大小写而不使用break语句,以便满足所有db升级。
https://medium . com/Google-developers/understanding-migrations-with-room-f01e 04 b 07929上有一篇关于房间迁移的很棒的文章 然而,我仍然错过了房间中的“灾难”恢复机制(例如,当发生异常情况时,将清除并重新创建数据库的fallbackToDestructiveRecreationOnMigrationError(
获取以下异常: 预期: TableInfo{name='chat_table',Columns={message=column{name='message',type='text',affinity='2',notnull=false,primarykeyposition=0},messageStatus=column{name='message status',type='text',affin
问题内容: 我正在使用JDBC在我的Java项目中连接到MySQL。我已经在mySQL表中实现了一些检查约束。 我有一个表单,用户可以在其中输入一些值并将其提交到MySQL表。如果违反约束,则Java会给出SQLException。 我的 目的 是显示有关表中违反 哪种 条件的弹出消息。 如何在Java中检索此信息? 我尝试了一个记录器,但它仅在控制台中显示冗长的错误消息。 问题答案: 您可以查看
我在存钱 进入我的房间数据库版本1。 现在我需要将