【问题标题】:kotlin Not sure how to handle insert method's return typekotlin 不确定如何处理插入方法的返回类型
【发布时间】:2026-02-20 13:05:01
【问题描述】:

我正在使用 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 kotlin android-room dao


【解决方案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()
    

    【讨论】:

      最近更新 更多