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)
}
}
}
用户.kt
data class User(
@ColumnInfo(name = "first_name")
val firstName: String,
@ColumnInfo(name = "last_name")
val lastName: String
)
生成时获取此错误
错误:无法弄清楚如何将此字段保存到数据库中。你可以考虑为它添加一个类型转换器。
即使在使用了类型转换器之后,问题仍然是持久的
我认为您的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