2

我正在尝试在我的 android 应用程序中实现 Room。我正在尝试从 API 获取数据并将它们保存在本地数据库中。但是当我运行应用程序时发生了这个错误

e: [kapt] 发生异常:java.lang.IllegalArgumentException: intcannot be convert to an Element

这是我的数据库类:

@Database(entities = [
    (User::class)],
        version = 1, exportSchema = false)
abstract class UserDatabase : RoomDatabase() {


    abstract fun userDao(): UserDao

    companion object {

        @Volatile
        private var INSTANCE: UserDatabase? = null

        fun getDatabase(context: Context): UserDatabase {

            if (INSTANCE == null){
                synchronized(this){
                    INSTANCE = Room.databaseBuilder(
                            context.applicationContext,
                            UserDatabase::class.java,
                            "user_database")
                            .build()
                }
            }
            return INSTANCE!!
        }
    }


}

这是我的存储库:

class Repository(application: Application) {


    private var mUserDao: UserDao

init {
        val db = UserDatabase.getDatabase(application)


    }
    @WorkerThread
    fun createUser(user: User) {
        mUserDao.createUser(user)
    }

    @WorkerThread
    fun deleteUser(id: Int) {
        mUserDao.deleteUser(id)
    }

    @WorkerThread
    fun getUser(id: Int) {
        mUserDao.getUser(id)
    }

这是我的 userDao

@Dao
interface UserDao{

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun createUser(user: User)

    @Delete
    fun deleteUser(int: Int)

    @Query("SELECT * FROM user WHERE user_id = :userID")
    fun getUser(userID: Int): LiveData<User>

}

我的登录视图模型:

class LoginViewModel(application: Application) : AndroidViewModel(application) {

    var repository: Repository = Repository(application)


    fun createUser(user: User) = repository.createUser(user)

}

也发生此错误:

org.gradle.api.tasks.TaskExecutionException:在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor 的任务 ':app:kaptDebugKotlin' <30 内部调用> 执行失败$Worker.run(ThreadPoolExecutor.java:617)<1 internal call> at java.lang.Thread.run(Thread.java:745) 原因:org.gradle.api.GradleException:编译错误。有关更多详细信息,请参阅 org.jetbrains.kotlin.gradle.internal.KaptWithKotlincTask.compile(KaptWithKotlincTask.kt:79)<17 internal 的 org.jetbrains.kotlin.gradle.tasks.TasksUtilsKt.throwGradleExceptionIfError(tasksUtils.kt:16) 的日志来电> ...33 更多

4

2 回答 2

10

问题出在你的@Delete

@Delete
fun deleteUser(int: Int)

应该是哪个

@Delete
fun deleteUser(user: User)

方法的参数@Delete应该是实体或实体的数组,而不是Int

于 2019-01-11T11:21:25.090 回答
3

这是解决方案:

正如上面提到的@musooff,我改变了这样的删除方法:

@Delete
fun deleteUser(user: User)

或者,如果您想删除具有特定 ID 的用户,请执行以下查询:

@Query("DELETE FROM user WHERE user_id = :id")
fun deleteUser(id: Int)

然后要解决下一个错误,您应该在存储库文件中的 Asynctask 内的 UserDao 中执行方法,例如创建用户我这样做:

private class insertAsyncTask internal constructor(private val mAsyncTaskDao: UserDao) : AsyncTask<User, Void, Void>() {
    override fun doInBackground(vararg params: User): Void? {
        mAsyncTaskDao.createUser(params[0])
        return null
    }
}

然后 Repository 中的 createUser 函数如下所示:

fun createUser(user: User) {
    insertAsyncTask(mUserDao).execute(user)
}

这为我解决了这个问题。

于 2019-01-11T13:35:48.150 回答