Skip to content

Instantly share code, notes, and snippets.

@zamahaka

zamahaka/Gist.kt Secret

Created December 17, 2017 12:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zamahaka/584963739a010842dfee90a545e34d1d to your computer and use it in GitHub Desktop.
Save zamahaka/584963739a010842dfee90a545e34d1d to your computer and use it in GitHub Desktop.
Problem with type converters
//Database.kt
@Database(entities = [User::class], version = 1)
@TypeConverters(*[DatabaseTypeConverters::class])
abstract class Database : RoomDatabase() {
abstract val userDao: UserDao
}
object DatabaseTypeConverters {
@TypeConverter
@JvmStatic
fun userTypeListToString(types: List<UserType?>?): String =
GsonBuilder().apply { registerAdapterFor<UserType>() }.create().toJson(types)
@TypeConverter
@JvmStatic
fun stringToUserTypeList(name: String?): List<UserType?>? = name?.let {
GsonBuilder().apply { registerAdapterFor<UserType>() }.create().fromJson(it)
}
}
//UserData.kt
@Entity(tableName = UserDao.TABLE_NAME)
data class User @JvmOverloads constructor(
@PrimaryKey @ColumnInfo(name = COLUMN_ID) var id: Long? = null,
@ColumnInfo(name = COLUMN_NAME) var name: String? = null,
@ColumnInfo(name = COLUMN_EMAIL) var email: String? = null,
@ColumnInfo(name = COLUMN_TYPES) var types: List<UserType?>? = null
)
enum class UserType { GROWER, LAB, DISPENSARY, PATIENT, DOCTOR, SUPPLIER, TRANSPORTATION, GOVERNMENT }
object UserColumns {
const val COLUMN_ID = "id"
const val COLUMN_NAME = "name"
const val COLUMN_EMAIL = "email"
const val COLUMN_TYPES = "types"
}
//GsonExt.kt
internal inline fun <reified T : Enum<T>> GsonBuilder.registerAdapterFor() {
registerTypeAdapter(T::class.java, JsonDeserializer { json, _, _ -> parseEnum<T>(json) })
}
private inline fun <reified T : Enum<T>> parseEnum(json: JsonElement): Enum<T>? = try {
enumValueOf<T>(json.asString.toUpperCase())
} catch (e: Exception) {
null
}
inline fun <reified T> Gson.fromJson(json: String): T =
this.fromJson<T>(json, object : TypeToken<T>() {}.type)
/*
* Getting this error:
* Cannot figure out how to save this field into database. You can consider adding a type converter for it.
*
* Error corresponds to 'types' property of User
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment