e:[kapt]发生异常:java.lang.IllegalArgumentException:无法将int转换为Element

时间:2019-01-11 10:57:17

标签: android kotlin android-room kapt

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

e:[kapt]发生异常:java.lang.IllegalArgumentException:无法将int转换为Element

这是我的数据库类:

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

抽象类AmbrogioDatabase:RoomDatabase(){

abstract fun userDao(): UserDao

companion object {

    @Volatile
    private var INSTANCE: AmbrogioDatabase? = null

    fun getDatabase(context: Context): AmbrogioDatabase {

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

}

这是我的存储库:

class Repository(application: Application) {


private var mUserDao: UserDao

init {         val db = AmbrogioDatabase.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

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>

}

我的LogginViewModel:

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

var repository: Repository = Repository(application)


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

}

还会发生此错误:

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

2 个答案:

答案 0 :(得分:1)

问题出在您的`@Delete

@Delete
fun deleteUser(int: Int)

应该是哪个

@Delete
fun deleteUser(user: User)

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

答案 1 :(得分:0)

这是解决方案:

就像上面提到的@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
    }
}

然后,存储库中的createUser函数如下所示:

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

这为我解决了问题。