当前位置: 首页 > 知识库问答 >
问题:

房间迁移-“notNull”属性显示错误信息

岳谦
2023-03-14

最近,我决定将我的应用程序从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吗?

提前感谢!

共有1个答案

邹山
2023-03-14

奇怪的例外

不完全是。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。

修复问题,您可以选择

  • a)将实体更改为不使用?或
  • b)更改表以使Not NULL不被编码。但是您仅限于能够重新命名列,您不能(直接)更改任何其他属性。

如果选择选项b),那么我建议,由于您没有添加/删除列,在迁移使用中:-

  1. database.execSQL("DROP TABLE IF EXISTS"常量.MOVIE_TABLE"_old;")
  2. database.execSQL("ALTER TABLE"常量。MOVIE_TABLE"RENAME TO"常量。MOVIE_TABLE"_old;"
  3. database.exeSQL("从生成的JAVA复制的创建表语句")
  4. database.exeSQL("INSERT INTO"常量。MOVIE_TABLE"SELECT*From"常量。MOVIE_TABLE"_old;")
  5. database.execSQL("DROP TABLE IF EXISTS"常量.MOVIE_TABLE"_old;")
  6. database.execSQL("VACUUM;")

笔记

  • 在Android studio中使用Android视图可以找到生成的java
  • 注:以上为原则性代码,尚未编译/测试或运行,因此可能包含一些错误
 类似资料:
  • 我正在使用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。 现在我需要将