Почему аннотации в комнате не работают с Kotlin - PullRequest
0 голосов
/ 05 июля 2019

Я читал много проблем здесь, в 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 () ^

1 Ответ

0 голосов
/ 05 июля 2019

Вы можете использовать только «Вставить», «Удалить» и «Обновить» как автоматически созданные функции, все эти 3 принимают экземпляр объекта.

Для выбора всего необходимо написать собственный запрос с аннотацией запроса, а также все другие пользовательские запросы (например, deleteAllPews и т. Д.).

Так сделайте вот так:

@Query("SELECT * From Pews")
public List<Pews> getAllPews();

EDIT:

Извините, не видел, что это Котлин:

@Query("SELECT * FROM Pews")
fun getAllPews() : List<Pews>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...