2017-10-05 14 views
1

我在我的項目中使用Room作爲本地數據庫解決方案。 對於我添加類型轉換器到項目中,以便類型轉換器會是這個樣子的某個對象類型的每個列表:Android:如何爲所有通用類型轉換器(for Room)製作Kotlin中的對象列表

@TypeConverter 
fun convertListToString(video: List<VideoType>): String { 

    val videoArray = arrayOfNulls<VideoType>(video.size) 
    for (i in 0..video.size - 1) { 
     videoArray[i] = video[i] 
    } 
    var str = "" 
    val gson = Gson() 
    for (i in videoArray.indices) { 
     val jsonString = gson.toJson(videoArray[i]) 
     str = str + jsonString 
     if (i < videoArray.size - 1) { 
      str = str + strSeparator 
     } 
    } 

    return str 
} 

@TypeConverter 
fun convertStringToList(videoString: String): List<VideoType> { 

    val videoArray = videoString.split(strSeparator.toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() 
    val videos = ArrayList<VideoType>() 
    val gson = Gson() 
    for (i in 0 until videoArray.size - 1) { 
     videos.add(gson.fromJson(videoArray[i], VideoType::class.java)) 
    } 

    return videos 
} 

唯一的問題是,我有一大堆不同類型的列表的那個需要轉換,所以目前我只是複製這個代碼的每一種類型。我想使用泛型,但到目前爲止還沒有弄清楚如何去做。

例如使用類似:

@TypeConverter 
inline fun <reified T> convertStringToList(string: String): List<T> { 
    val objectArray = string.split(strSeparator.toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() 
    val objects = ArrayList<T>() 
    val gson = Gson() 
    for (i in 0 until objectArray.size - 1) { 
     objects.add(gson.fromJson(objectArray[i], T::class.java)) 
    } 
    return objects 
} 

不能正常工作,並導致了Android Studio的編譯錯誤,給我一個錯誤說服力:類型轉換器必須是公共

任何人的想法如何我可以爲我的房間類型轉換器使用泛型?

回答

0

我剛剛測試了這一點,似乎做你會尋找什麼基地。你來調整功能,以您的需求,但應該讓你去: 參考https://kotlinlang.org/docs/reference/generics.html#generic-functions

fun test() { 
     val list1 = listOf("1", "2") 
     val list2 = listOf(1, 2, 3) 

     list1.convertToString() 
     list2.convertToString() 
    } 

    fun List<Any>.convertToString(): String { 
     var result = "" 
     val gson = Gson() 
     for (i in 0.. size - 1) { 
      result += gson.toJson(get(i), get(i).javaClass) 
     } 
     return result 
    } 
+1

這可能會做將任何類型的列表轉換爲字符串的伎倆,但它不解決問題的與房間一起使用typeConvertors。如果我在列表上使用擴展名,我想將其轉換爲字符串(即使使用@typeConverter對其進行註釋)。 「無法弄清楚如何將該字段保存到數據庫中。」 –

相關問題