私はプロジェクトで、ローカル データベース ソリューションとして Room を使用しています。特定のオブジェクト タイプのリストごとに、プロジェクトにタイプ コンバーターを追加したので、タイプ コンバーターは次のようになります。
@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 でコンパイル エラーが発生し、次のようなエラーが表示されます。型コンバータはパブリックである必要があります
Room TypeConverter にジェネリックを使用する方法をご存知の方はいらっしゃいますか?
ベストアンサー1
このようなものはテンプレートには使えないのでしょうか?
abstract class Converters<T> {
@TypeConverter
fun mapListToString(value: List<T>): String {
val gson = Gson()
val type = object : TypeToken<List<T>>() {}.type
return gson.toJson(value, type)
}
@TypeConverter
fun mapStringToList(value: String): List<T> {
val gson = Gson()
val type = object : TypeToken<List<T>>() {}.type
return gson.fromJson(value, type)
}
}
// create
class UserConverter : Converters<User>()
// usage
@TypeConverters(UserConverter::class)
abstract class TestDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
あるいは、現在の例から、もし私が
@TypeConverter
fun <T> mapStringToList(inputString: String): List<T> {
val array = inputString
.split(strSeparator.toRegex())
.dropLastWhile { it.isEmpty() }
.toTypedArray()
val result = mutableListOf<T>()
val gson = Gson()
// �� ----
val type = object : TypeToken<List<T>>() {}.type
// ----
return array.fold(result) { acc, item ->
acc.add(gson.fromJson(item, type))
acc
}
}