【问题标题】:How to create a new instance of the a entity without primary key?如何创建没有主键的实体的新实例?
【发布时间】:2018-12-03 11:52:13
【问题描述】:

抱歉,这是一个愚蠢的问题。我正在尝试熟悉 Kotlin 并遇到了一个问题。我有一个 kotlin 应用程序,我在其中使用 Room 存储数据。

这是我的实体类:

@Entity
data class Link(@PrimaryKey(autoGenerate = true) var _id: Int,
        @ColumnInfo(name = "link_url") var linkUrl: String?,
        @ColumnInfo(name = "timestamp") var timestamp: Long?)

如何在不指定_id 的情况下创建Link 的新实例?

var link: Link = Link("url", 12334)

提前谢谢你!

【问题讨论】:

  • 尝试默认值..如果你使用的是 kotlin,那么它很有用..

标签: android mobile kotlin


【解决方案1】:

你可以创建另一个带有@Ignore注解的构造函数,这样它就会被Room忽略:

@Ignore
constructor(var linkUrl: String?, timestamp: Long?) : this (null, linkUrl, timestamp)

如果您为自动生成的字段传递null,它将自动生成新值。

【讨论】:

  • 为什么在我们拥有 kotlin 的默认值特性的情况下重写构造函数??
  • @Moinkhan 这在您需要两个构造函数的情况下很有用
  • 这就是 kotlin 中的默认值所做的。它将生成 2 个构造函数 ..
【解决方案2】:

在 kotlin 中使用默认值。

@Entity
data class Link(@PrimaryKey(autoGenerate = true) var _id: Int = -1,
        @ColumnInfo(name = "link_url") var linkUrl: String?,
        @ColumnInfo(name = "timestamp") var timestamp: Long?)

那你必须这样打电话。

var link: Link = Link(linkUrl = "url",timestamp = 12334)

现在我们需要使用命名参数,因为我们的默认参数_id 是第一个参数。如果_id 是最后一个参数,那么你可以直接调用它。

var link: Link = Link("url", 12334)

注意:如果你想要Java中的两个构造函数,那么你必须在构造函数上使用@JvmOverloads

@Entity
data class Link @JvmOverloads constructor(
   // .....
)

【讨论】:

  • 这将生成所有具有相同 id 的对象,并且持久化会在持久化时抛出错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多