我正在尝试在我的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更多
答案 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)
}
这为我解决了问题。