kotlin 不确定如何处理插入方法的返回类型
Posted
技术标签:
【中文标题】kotlin 不确定如何处理插入方法的返回类型【英文标题】:kotlin Not sure how to handle insert method's return type 【发布时间】:2020-09-07 23:58:15 【问题描述】:我正在使用 kotlin 和房间库开发一个 android 应用程序。当我尝试获取插入项目的 id 时,我收到以下错误
不确定如何处理插入方法的返回类型。 公共抽象 java.lang.Object insertReceipt(@org.jetbrains.annotations.NotNull()
我尝试过其他解决方案,例如 this,但它不起作用
这是我的代码
Receipt.kt
@Entity
data class Receipt(
@ColumnInfo() val receipt_timestamp: Timestamp,
@ColumnInfo() val receipt_items: Int,
@ColumnInfo() val receipt_total_price: BigDecimal
)
@PrimaryKey(autoGenerate = true)
var receiptNo: Int = 0
ReceiptDao.kt
@Insert()
suspend fun insertReceipt(receipt: Receipt): Int
ReceiptRepository.kt
suspend fun insertReceipt(receipt: Receipt): Int
return receiptDAO.insertReceipt(receipt)
【问题讨论】:
这能回答你的问题吗? Android Room - Get the id of new inserted row with auto-generate 【参考方案1】:那是因为您无法获得这样的 id。您可以使用此函数获取一个 id,但它不会是您想要的。
cf:https://developer.android.com/training/data-storage/room/accessing-data#convenience-insert返回的id是sqlite使用的内部id。
要实现你想要的,你需要这样的东西:
@Query("SELECT receiptNo FROM receipt WHERE receipt_timestamp = :receipt_timestamp AND receipt_items = : receipt_items AND receipt_total_price = :receipt_total_price LIMIT 1")
fun getId(receipt_timestamp: Timestamp, receipt_items: Int, receipt_total_price: BigDecimal): Int
【讨论】:
【参考方案2】:带有@Insert 注解的方法可以返回:
long for single insert operation long[] or Long[] or List for multiple insert operations void if you don't care about the inserted id(s)
因此,您必须将 insertReceipt 的返回类型从 Int 更改为 Long:
return receiptDAO.insertReceipt(receipt).toLong()
【讨论】:
以上是关于kotlin 不确定如何处理插入方法的返回类型的主要内容,如果未能解决你的问题,请参考以下文章
如何解决错误:使用 RX java 在实现室中“不确定如何处理插入方法的返回类型”
侦听firebase数据库节点时如何处理kotlin中的竞争条件