Не могу понять, как сохранить это поле в базе данных. Я написал класс данных, dao и typeconverters, но все еще не могу обнаружить ошибку

#android #kotlin #android-room

#Android #kotlin #android-комната

Вопрос:

MyData.kt

 @Entity(tableName = "my_table")
data class MyData(

    @PrimaryKey(autoGenerate = true)
    var id: Long = 0L,

    @ColumnInfo(name = "ListData")
    @TypeConverters(DataTypeConverter::class)
    var mList: List<User> = emptyList(),

    @Embedded
    var user: User
)
 

MyDataDao.kt

 @Dao
interface MyDataDao {

    @Insert
    suspend fun insert(data: MyData)

    @Update
    suspend fun update(data: MyData)

    @Query("SELECT * FROM my_table")
    fun getAll(): LiveData<List<MyData>>
}
 

DataTypeConverter.kt

 import androidx.room.TypeConverter
    import com.google.gson.Gson
    import com.google.gson.reflect.TypeToken
    
    class DataTypeConverter {
        companion object {
            inline fun <reified T> Gson.fromJson(json: String) =
                fromJson<T>(json, object : TypeToken<T>() {}.type)
    
            @TypeConverter
            fun stringToList(data: String?): List<User> {
                data?.let {
                    return Gson().fromJson(data)
                }
                return emptyList()
            }
    
            @TypeConverter
            fun listToString(users: List<User>): String {
                return Gson().toJson(users)
            }
        }
    }
 

User.kt

 data class User(
    @ColumnInfo(name = "first_name")
    val firstName: String,

    @ColumnInfo(name = "last_name")
    val lastName: String
)
 

при сборке появляется эта ошибка

ошибка: не удается выяснить, как сохранить это поле в базе данных. Вы можете рассмотреть возможность добавления для него преобразователя типов.

Даже после использования typeconverters проблема остается постоянной

Ответ №1:

Я думаю, что ваш DataTypeConverter неверен, вы можете попробовать изменить его следующим образом :

 class DataTypeConverter{

    var gson = Gson()

    @TypeConverter
    fun stringToUserList(data: String?): List<User?>? {
        if (data == null) {
            return Collections.emptyList()
        }
        val listType: Type =
            object : TypeToken<List<User?>?>() {}.type
        return gson.fromJson<List<User?>>(data, listType)
    }

    @TypeConverter
    fun userDetailListToString(someObjects: List<User?>?): String? {
        return gson.toJson(someObjects)
    }
}
 

Не забудьте добавить @TypeConverters(DataTypeConverter::class) в @Database