【发布时间】:2023-01-12 05:42:31
【问题描述】:
我只需要澄清一下,但这是我们覆盖 hashcode 方法的原因,为存储在 database 中的每个 instance 提供一个唯一地址。如果是这样,为什么不自动生成 hashcode?
我还有另一个关于Room Databases 的问题,我知道有些文章(来自新闻 API)没有 ID,因此我必须找到一种方法来识别文章,因为 Room 需要 ID。
我尝试将 URL 设置为 Primary Key 但是我收到此错误
error: There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (no such column: id) public abstract androidx.lifecycle.LiveData<java.util.List<com.example.secondnews.Article>> getAllArticles();
然后我添加了一个 ID 参数,点击后导致崩溃这是错误
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Object.hashCode()' on a null object reference
在询问之后,我得到了这个解决问题的答案,但是我无法解决这个问题,为什么我们要检查if(url.isNullOrEmpty())?我认为 Url 永远不会为空,因此这行代码永远不会运行 result = 31 * result + url.hashCode()
override fun hashCode(): Int {
var result = id.hashCode()
if(url.isNullOrEmpty()){
result = 31 * result + url.hashCode()
}
return result
}
如果ID 为空,var result = id.hashCode() 不会返回零吗?因为URL 永远不会为空,这意味着我们将返回零作为哈希码?
此外,设置 @PrimaryKey(autoGenerate = true) 不会导致自动生成 ID 吗?如果是这样的话,ID 怎么会是空的?
房间实体
@Entity(
tableName = "articles", indices = [Index(value = ["url","title"], unique = true)]
)
@Parcelize
data class Article(
@PrimaryKey(autoGenerate = true)
var id: Int? =null,
val author: String?,
val description: String?,
val source: Source?,
val title: String?,
val url: String?,
val urlToImage: String?,
val publishedAt: String?,
val content: String?
): Parcelable {
override fun hashCode(): Int {
var result = id.hashCode()
if(url.isNullOrEmpty()){
result = 31 * result + url.hashCode()
}
return result
}
}
【问题讨论】:
标签: android android-room