Estoy tratando de guardar este objeto en la base de datos de Room, leí sobre Typeconverters para convertir objetos complejos en un archivo que se puede almacenar en la base de datos. Recibo este error: error: No estoy seguro de cómo convertir un Cursor al tipo de retorno de este método (androidx.lifecycle.LiveData>).---- public abstract androidx.lifecycle.LiveData> queryQuestions(@org.jetbrains.annotations. NotNull() Mi código se basa en soluciones que encontré para problemas similares con la conversión de objetos para la habitación, pero esto no funciona para mí.
Mi clase de pregunta:
@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("", "") }Mi clase de dao:
@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>> }Mi clase de base de datos:
@Database(entities = [Question::class], version = 1) @TypeConverters(Converter::class) abstract class AppDatabase : RoomDatabase(){ abstract fun questionDao(): QuestionDao }Mi clase de convertidor:
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) } }Cambie ArrayList a List .
Esto funciona para mi.
El problema que tiene es causado por el uso de LiveData. Desde Android API 28, las bibliotecas de soporte se han movido a androidx. Esto significa que tienes que mover TODO a androidx. Su problema radica en un archivo build.gradle. Probablemente tenga el ciclo de vida de andoidx allí, pero Room lib como el antiguo 1.1.1 Room lib. Debe actualizar todas las bibliotecas de soporte para usar androidx así:
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"