e: [kapt] возникла исключительная ситуация: java.lang.IllegalArgumentException: int не может быть преобразована в элемент - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь реализовать Room в моем приложении для Android. Я пытаюсь получить данные из API и сохранить их в локальной базе данных. Но когда я запускаю приложение, эта ошибка произошла

e: [kapt] Возникла исключительная ситуация: java.lang.IllegalArgumentException: не может быть преобразовано в элемент

Это мой класс базы данных:

@Database(entities = [
    (User::class)],
        version = 1, exportSchema = false)
abstract class 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)
    }

А вот и мой пользователь Дао

@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>

}

Мой 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 голосов
/ 11 января 2019

Это решение:

Как упомянуто выше @musooff, я изменил метод удаления следующим образом:

@Delete
fun deleteUser(user: User)

или если вы хотите удалить пользователя с определенным идентификатором, выполните этот запрос:

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

Затем, чтобы решить следующую ошибку, вы должны выполнить методы в UserDao внутри Asynctask в файле репозитория например для создания пользователя я сделал это:

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)
}

Это решило проблему для меня.

0 голосов
/ 11 января 2019

Проблема заключается в вашем `@ Delete

@Delete
fun deleteUser(int: Int)

Что должно быть

@Delete
fun deleteUser(user: User)

Параметр для метода @Delete должен быть сущностью или массивом сущности, а не Int

...