Kotlin - 使用 Persistence Room:运行时库从 Room 数据库返回新插入的 id

8
我正在尝试使用 Kotlin 在 Room 数据库中插入用户记录,并且它完美地运作。
现在,我想返回新插入的记录 ID ,以检查是否成功将记录插入 Room 数据库。
但是,当我在插入方法中应用 Long 返回类型并运行代码时,我会收到以下错误。

error: Method returns long but it should return one of the following: void, long[], java.lang.Long[], java.util.List<java.lang.Long>. If you want to return the list of row ids from the query, your insertion method can receive only 1 parameter.

public abstract long insertUser(@org.jetbrains.annotations.NotNull()

我正在使用这个库。

implementation "android.arch.persistence.room:runtime:1.0.0"

kapt "android.arch.persistence.room:compiler:1.0.0"

这是我的插入查询。

@Insert
fun insertUser(vararg userRegistrationEntity: UserRegistrationEntity):Long;

这里是我的addAsyncTask,在其中向Room数据库插入记录。

private fun userRegistration(userRegistrationEntity: UserRegistrationEntity) {
        addAsyncTask(appDatabase!!).execute(userRegistrationEntity) 
    }

    private class addAsyncTask constructor(private val appDatabase: AppDatabase) : AsyncTask<UserRegistrationEntity, Void, Long>() {
        override fun doInBackground(vararg params: UserRegistrationEntity): Long? {
           // val a = appDatabase.userRegistrationDao().addUser(params[0]);
            val newReturnId = appDatabase.userRegistrationDao().insertUser(params[0]);
            return newReturnId
        }

        override fun onPostExecute(result: Long?) {
            super.onPostExecute(result)
            Log.d("value", result.toString()) 
        }
    }
2个回答

22

如果您正在插入多个实体,那么只能以数组或列表的形式获取它们的ID,例如:

@Insert
fun insertUsers(vararg userRegistrationEntities: UserRegistrationEntity): List<Long>

如果您一次插入一个实体,那么您可以将其ID作为Long返回:

@Insert
fun insertUser(userRegistrationEntity: UserRegistrationEntity): Long

当我使用List<Long>时,它可以工作,但是当我像你说的那样只使用Long来表示一个实体时,它会给我上面的错误。 - Vikas singh
2
如果您想使用Long,则需要删除vararg并仅插入一个元素,就像我上面展示的那样。 - zsmb13
@zsmb13,如果插入失败,但我期望返回单个长整型值的情况下,会有什么返回值? - Karthikeyan Ve
1
如果插入失败,我认为你会得到一个SQLException或类似的错误。 - zsmb13

3

根据此文档,用 @Insert 注释的方法可以返回以下内容:

long for single insert operation
long[] or Long[] or List<Long> for multiple insert operations
void if you don't care about the inserted id(s)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接