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中的竞争条件

Spring DBUnit 插入数据的时候如何处理自增ID

如何处理插入 '\0' 的字符数组?

如何处理对 RecyclerView 列表项内部视图的点击。使用数据绑定和 kotlin

Nhibernate 如何处理插入、更新、删除