База данных комнаты Android - Не уверен, как преобразовать курсор в тип возвращаемого значения этого метода - PullRequest
2 голосов
/ 20 марта 2019

Я пытаюсь сохранить этот объект в базе данных Room, я прочитал о преобразователях типов для преобразования сложных объектов в один файл, который можно сохранить в базе данных. Я получаю эту ошибку: ошибка: Не уверен, как преобразовать Курсор в тип возврата этого метода (androidx.lifecycle.LiveData>) .---- public abstract androidx.lifecycle.LiveData> queryQuestions (@ org.jetbrains.annotations.NotNull () Мой код основан на решениях, которые я нашел для аналогичных проблем с преобразованием объектов для комнаты, но это не работает для меня.

Мой класс вопросов:

@Entity

    data class Question(@PrimaryKey var questionId: String = "",
                        val uid: String,
                        val name: String,
                        val photo: String,
                        val question: String,
                        val points: Int,
                        @ServerTimestamp val timestamp: Date? = null,
                        val options: ArrayList<Option>){
        constructor(): this("", "", "", "", "", 0, null, ArrayList())
    }

    data class Option(val optionText: String,
                      val correct: Boolean,
                      var votes: Int = 0,
                      var usersVoted: ArrayList<UserVoted> = ArrayList()){
        constructor(): this("", false /*,0, ArrayList()*/)
    }

    data class UserVoted(val name: String,
                         val photo: String){
        constructor(): this("", "")
    }

Мой класс дао:

@Dao
interface QuestionDao {
    @Insert(onConflict = REPLACE)
    fun insertQuestions(question: ArrayList<Question>)

    @Query("SELECT * FROM question WHERE uid = :userId")
    fun queryQuestions(userId: String): LiveData<ArrayList<Question>>
}

Класс моей базы данных:

@Database(entities = [Question::class], version = 1)
@TypeConverters(Converter::class)
abstract class AppDatabase : RoomDatabase(){
    abstract fun questionDao(): QuestionDao

}

Мой конвертер класса:

class Converter {

    @TypeConverter
    fun fromTimestampToDate(value: Long?): Date? {
        return value?.let { Date(it) }
    }

    @TypeConverter
    fun fromDateToTimestamp(date: Date?): Long? {
        return date?.time?.toLong()
    }

    @TypeConverter
    fun fromStringToArrayList(value: String): ArrayList<Option> {
        Log.i("alengenije", "fromStringToArrayList string = $value")
        val listType = object:TypeToken<ArrayList<Option>>() {}.type
        return Gson().fromJson(value, listType)
    }

    @TypeConverter
    fun fromArrayLisrToString(list: ArrayList<Option>): String {
        val gson = Gson()
        return gson.toJson(list)
    }

}

1 Ответ

0 голосов
/ 05 мая 2019

Проблема, с которой вы столкнулись, связана с использованием LiveData.Из Android API 28 библиотеки поддержки перешли на androidx. Это означает, что вам нужно переместить ВСЕ на androidx.Ваша проблема связана с файлом build.gradle.Вероятно, у вас есть жизненный цикл andoidx, но Room lib - старая версия 1.1.1 Room lib.Вы должны обновить все библиотеки поддержки для использования androidx следующим образом:

def lifecycle_version = "2.0.0"

implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.0.0'

// Add RecyclerView dependency; must match SDK version
implementation 'androidx.recyclerview:recyclerview:1.0.0'

// Add FAB dependency
implementation 'com.google.android.material:material:1.0.0-rc01'

def room_version = "2.1.0-alpha07"

implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"

implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
...