当我尝试将歌曲列表插入 Playlist 类时,应用程序崩溃。我正在使用新的 Android studio 版本 Flamingo 和类型转换程序来转换模型类列表。 这是我的转换器类,我已将类型转换器添加到我的数据库类中。
class DataConverters {
@TypeConverter
fun toSongList(string: String): List<Song> {
val listType = object : TypeToken<List<Song>>() {}.type
return Gson().fromJson(string, listType) //here crash
}
@TypeConverter
fun fromSongList(list: List<Song>): String {
return Gson().toJson(list)
}
}
这是我的歌曲模型课
@Entity(tableName = "song")
data class Song(
val displayName:String,
val artist:String,
val data:String,
val duration:Int,
val title:String,
val album: String,
val uri: Uri,
val artUri: String,
val dateAdded: String,
@PrimaryKey val id:Long
){
fun doesMatchSearchQuery(query: String): Boolean {
val matchingCombinations = listOf(
displayName
)
return matchingCombinations.any {
it.contains(query, ignoreCase = true)
}
}
}
这是我的播放列表课程。
@Entity(tableName = "playlist")
data class Playlist(
@PrimaryKey val playlistName: String,
val songCount: Int,
val playlistDuration: Long,
val songs: List<Song>,
)
我尝试添加一些混淆规则,但没有帮助我。
我认为错误来自
val uri: Uri
,因为 Gson 不知道如何反序列化 Uri。
您应该为此类型注册一个适配器
class UriJsonAdapter: JsonSerializer<Uri>, JsonDeserializer<Uri> {
override fun serialize(src: Uri, typeOfSrc: Type, context: JsonSerializationContext): JsonElement {
return JsonPrimitive(src.toString())
}
override fun deserialize(src: JsonElement, srcType: Type, context: JsonDeserializationContext): Uri {
return try {
val url = src.asString
if (url.isNullOrEmpty()) {
Uri.EMPTY
} else {
Uri.parse(url)
}
} catch (e: UnsupportedOperationException) {
Uri.EMPTY
}
}
}
GsonBuilder().registerTypeAdapter(Uri::class.java, UriJsonAdapter())