我正在尝试在我的 Room 数据库中保存一些数据,但它一直向我显示错误,这是代码:
电影道.kt
@Dao
interface MoviesDao {
@Query("SELECT * from movie")
fun getAll() : LiveData<List<Movie>>
@Update
fun update(movie: Movie)
@Insert(onConflict = OnConflictStrategy.IGNORE)
fun insert(movie: Movie)
}
电影数据库.kt
@Database(entities = [Movie::class], version = 1, exportSchema = false)
@TypeConverters(TorrentConverter::class, GenreConverter::class)
abstract class MoviesDatabase : RoomDatabase() {
companion object {
private var instance: MoviesDatabase? = null
fun getDatabase(context: Context) : MoviesDatabase{
if(instance == null) {
instance = Room.databaseBuilder(context.applicationContext, MoviesDatabase::class.java,
"movies_database").build()
}
return instance as MoviesDatabase
}
}
abstract fun getMoviesDao() : MoviesDao
}
电影模型.kt
@Entity(tableName = "movie")
data class Movie(
val url: String,
@PrimaryKey
val imdb_code: String,
val title: String,
val year: Int,
val rating: Float,
val runtime: Int,
@TypeConverters(GenreConverter::class)
val genres: List<String>?,
val synopsis: String,
val yt_trailer_code: String,
val language: String,
val mpa_rating: String,
val medium_cover_image: String,
val large_cover_image: String,
val state: String,
@TypeConverters(TorrentConverter::class)
var torrents: List<Torrent>,
var saved: Boolean = false,
var marked: Boolean = false
) : Serializable
data class Torrent(
val url: String,
val hash: String,
val quality: String,
val seeds: Int,
val peers: Int,
val size: String,
val size_bytes: Long
) : Serializable
类型转换器.kt
class TorrentConverter {
@TypeConverter
fun toTorrent(json: String): Torrent {
val type = object : TypeToken<Torrent>() {}.type
return Gson().fromJson(json, type)
}
@TypeConverter
fun toJson(torrent: Torrent) = Gson().toJson(torrent)
}
class GenreConverter {
@TypeConverter
fun toGenre(json: String): List<String> {
val type = object : TypeToken<List<String>>() {}.type
return Gson().fromJson(json, type)
}
@TypeConverter
fun toJson(genres: List<String>) = Gson().toJson(genres)
}
错误告诉我:
error: Cannot figure out how to save this field into database. You can consider adding a type converter for it. private java.util.List torrents;
有人可以帮我弄清楚为什么会发生这个错误吗?非常感谢。
最佳答案
发生这种情况是因为您的 TorrentConverter 正在返回并获取错误的类型。
方法toTorrent
应该返回 List<Torrent>
和方法toJson
应该收到 List<Torrent>
试试这个 TypeConverter:
class TorrentConverter {
@TypeConverter
fun toTorrent(json: String): List<Torrent> {
val type = object : TypeToken<List<Torrent>>() {}.type
return Gson().fromJson(json, type)
}
@TypeConverter
fun toJson(torrent: List<Torrent>): String {
val type = object: TypeToken<List<Torrent>>() {}.type
return Gson().toJson(torrent, type)
}
}
关于Android房间类型转换器不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51847212/