Я читал много проблем здесь, в Stackoverflow, но не смог получить помощь.
Я пытаюсь создать простое приложение Room
, в котором оно хранит String
, а затем распечатывает все результаты, как они просты. Проблема начинается, когда я пытаюсь запустить проект.
Если я не добавлю kapt
штуку, она будет работать нормально, но тогда будет написано
java.lang.IllegalArgumentException
com.example.database.dao.UserDao_Impl.getData не определено
Итак, я прочитал, что в Kotlin
есть проблема с AnnotationProcessor
, поэтому я изменил его на kapt ...
, а также добавил apply plugin : 'android-kapt'
на (Module:app)
.
Я использую:
ext.kotlin_version = '1.3.41'
classpath 'com.android.tools.build:gradle:3.4.1'
roomVersion = '1.1.1'
И implementation
библиотек:
implementation "android.arch.persistence.room:runtime:$roomVersion"
kapt "android.arch.persistence.room:compiler:$roomVersion"
implementation "android.arch.persistence.room:rxjava2:$roomVersion"
Я не знаю, что мне не хватает, потому что там написано:
ошибка: абстрактный метод DAO должен быть аннотирован одной и только одной из следующих аннотаций: Вставить, Удалить, Запрос, Обновить, RawQuery
public abstract java.util.List getAllPews ();
^
И я не понимаю, потому что Дао содержит @Dao
, моя база данных содержит @Database
, а моя сущность содержит @Entity(tableName = "pews")
.
На этой странице ничего не получается
app / build / tmp / kapt3 / заглушки / debug / com / myapp / roomkotlinexample / Pews.java
Но если я открою, то смогу увидеть @Dao
, он конвертируется в @android.arch.persistence.room.Dao()
и то же самое с @Database
и @Entity
ДАО
@Dao
interface PewDao {
@Query("SELECT * FROM pews WHERE pew = :pew")
fun getPewById(pew: String): Single<Pews>
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertPew(food: Pews): Completable
@Query("SELECT * FROM pews")
fun getAllPews() : List<Pews>
}
Entity
@Entity(tableName = "pews")
data class Pews (
@PrimaryKey
@NonNull
@ColumnInfo(name = "pew")
val pew: String = ""
)
База данных
@Database(entities = [Pews::class], version = 1)
abstract class PewDatabase : RoomDatabase() {
abstract fun pewDao() : PewDao
companion object {
@Volatile private var INSTANCE: PewDatabase? = null
fun getInstance(context: Context): PewDatabase =
INSTANCE ?: synchronized(this) {
INSTANCE ?: buildDatabase(context).also { INSTANCE = it }
}
private fun buildDatabase(context: Context) =
Room.databaseBuilder(context.applicationContext,
PewDatabase::class.java, "sample_db")
.allowMainThreadQueries()
.build()
}
}
MainActivity
private fun addPew(pew: String){
Single.fromCallable {
BrewDatabase.getInstance(this).pewDao().insertPew(Pew(pew))
}.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()).subscribe()
}
Текущая ошибка
ошибка: методы, аннотированные @Insert, могут возвращать void, long, Long, long [], Long [] или List.
общедоступный абстрактный io.reactivex.Completable insertPew (@ org.jetbrains.annotations.NotNull ()
^