【问题标题】:Android Room TypeConverter not workingAndroid房间类型转换器不工作
【发布时间】:2018-08-14 17:53:01
【问题描述】:

我正在尝试在我的 Room 数据库中保存一些数据,但它一直显示错误,这是代码:

MovieDao.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
}

MovieModels.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

TypeConverters.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)
}

错误告诉我:

错误:无法弄清楚如何将此字段保存到数据库中。你可以 考虑为它添加一个类型转换器。 私有 java.util.List 种子;

有人可以帮我弄清楚为什么会发生这个错误吗?非常感谢。

【问题讨论】:

  • 也许this post 有帮助?
  • 谢谢,我的代码与第二个答案非常相似,但仍然无法正常工作。但是谢谢=)

标签: android android-room object-composition


【解决方案1】:

这是因为您的 TorrentConverter 正在返回并获取错误的类型。 方法toTorrent 应该返回一个List&lt;Torrent&gt; 并且方法toJson 应该接收一个List&lt;Torrent&gt; 试试这个 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)
    }
}

【讨论】:

    猜你喜欢
    • 2018-07-06
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多