前言
Room是Google 新推出的Jetpack組件庫(kù)中一款操作數(shù)據(jù)庫(kù)的SQLITE ORM庫(kù)械念。其風(fēng)格類似Retrofit,使用注解+接口聲明形式运悲,簡(jiǎn)化了數(shù)據(jù)庫(kù)的操作龄减。
隨著時(shí)間的推遲,Room迭代更新的版本也越來越快班眯,到目前(本文所寫時(shí)間為止)最新的版本是2.1.0-alpha02希停,它的一些API也做了調(diào)整,本文是記錄一次@TypeConverters(ThumbConverter::class)的使用
本文是以Kotlin語言實(shí)例署隘,Java語法類似
定義實(shí)體類 News.kt
@Entity
data class News(
@PrimaryKey
var row: String,
var title: String = "",
var type: Int = 2,
val thumb: List<String>?,
var content_time: String? = "",
var source: String? = "",
var hot: Int = 0
)
發(fā)現(xiàn)Android Studio會(huì)報(bào)如下錯(cuò)誤脖苏,編譯不通過,原因是@Entity定義的thumb字段無法識(shí)別List<String>?類型(非基礎(chǔ)類型)定踱,最終映射成數(shù)據(jù)庫(kù)字段棍潘,所以Room提供一個(gè)解決方案:手動(dòng)做類型轉(zhuǎn)換,用轉(zhuǎn)換類告訴Room該如何轉(zhuǎn)換成數(shù)據(jù)庫(kù)支持的類型。
/Users/Documents/code/news_android2.0/module_news/build/tmp/kapt3/stubs/debug/com/zm/module/news/repository/entity/News.java:15: 錯(cuò)誤: Cannot figure out how to save this field into database. You can consider adding a type converter for it.
private final java.util.List<java.lang.String> thumb = null;
^
定義TypeConverter類
class ThumbConverter {
@TypeConverter
fun getThumbFromString(value: String):List<String>? {
return value.split(",")
}
@TypeConverter
fun storeThumbToString(list: List<String>): String {
val str = StringBuilder(list[0])
list.forEach {
str.append(",").append(it)
}
return str.toString()
}
}
@TypeConverter的兩個(gè)方法是成對(duì)出現(xiàn)的亦歉,方法名稱可以任意命名恤浪,重點(diǎn)在入?yún)⒑统鰠㈩愋停仨毷切枰D(zhuǎn)換的類型和最終轉(zhuǎn)換后的類型肴楷,這點(diǎn)想一下原理能明白了水由。上面示例寫入時(shí)將List<String>類型轉(zhuǎn)換成以“,”逗號(hào)拼接的String類型赛蔫,讀取時(shí)再將逗號(hào)分割的字符串轉(zhuǎn)換成List<String>類型砂客。
Room 2.0@TypeConverters調(diào)整
經(jīng)過上面的定義依然是無法編譯通過的,原因是Entity類還需要添加這里@TypeConverters呵恢,強(qiáng)調(diào)一下@TypeConverters 是有s的
鞠值,要與轉(zhuǎn)換類方法上的@TypeConverter做區(qū)別。在現(xiàn)有的很多文章里提到@TypeConverters都是加到屬性上的
渗钉,如:stackoverflow上的問答彤恶,在Room 2.0是會(huì)報(bào)錯(cuò)的,因?yàn)楝F(xiàn)在已經(jīng)改為加到Entity類
上面了鳄橘。
錯(cuò)誤的
@TypeConverters(ThumbConverter::class)
val thumb: List<String>?,
正確的
@Entity
@TypeConverters(ThumbConverter::class)
data class News(
@PrimaryKey
var row: String,
var title: String = "",
var type: Int = 2,
val thumb: List<String>?,
var content_time: String? = "",
var source: String? = "",
var hot: Int = 0
)
后記
多個(gè)轉(zhuǎn)換類可以@TypeConverters(ThumbConverter::class声离,XXXX::Converter::class)
定義。