#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