Android房间类型转换器不工作

标签 android android-room object-composition

我正在尝试在我的 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/

相关文章:

android - ListView 的自定义适配器导致错误

android - 通过文件系统访问 Android NDK 中的资源

android - 如何在 Android 中使用 Room 存储对象数组?

Java - 为什么 ClassName.this.variable 在变量为静态时起作用?

java - Android 可以执行 Activity 的方法

android - 更新到 gradle 6.x variant.getVariantData().getVariantConfiguration() 后 Gradle 代码损坏

java - Kotlin 房间 :Entities and Pojos must have a usable public constructor

java - 重置sqlite序列自动增量

java - 在 Java 中混合组合和继承

c++ - 将继承重构为组合,在 C++ 中保持多态能力