Android ROOM сохранить карту - PullRequest
0 голосов
/ 04 марта 2019

У меня есть такая модель

@Entity(tableName = "allrates")
class Data(
        @ColumnInfo(name = "rates")
        @SerializedName("rates")
        @Expose
        var rates: Map<String, Rates>,

        @ColumnInfo(name = "start")
        @SerializedName("start_at")
        @Expose
        var startDate: String,

        @ColumnInfo(name = "end")
        @SerializedName("end_at")
        @Expose
        var endDate: String,

        @SerializedName("base")
        @Expose
        var base: String,

        @PrimaryKey(autoGenerate = true)
        var id: Int  
)

И моя проблема в том, что, когда я пытаюсь вставить в базу данных, не выдает ошибку, но когда я делаю ´get´ всегда возвращает мне ноль.Так что, вероятно, моя проблема в «Конвертере», но я не уверен в этом.

И это мой конвертер

class mapConverter {
    @TypeConverter
    fun fromString(value: String): Map<String, Rates> {
        val mapType = object : TypeToken<Map<String, Rates>>() {

        }.type
        return Gson().fromJson(value, mapType)
    }

    @TypeConverter
    fun fromStringMap(map: Map<String, Rates>): String {
        val gson = Gson()
        return gson.toJson(map)
    }
}

И вот идетDAO

@Dao
abstract class RatesDao {

    @Query("SELECT * FROM allrates")
    abstract fun loadRates(): LiveData<Data>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    abstract fun insertRates(rates: Data)
}

Связь с ROOM

@Database(entities = [(Data::class)], version = 1, exportSchema = false)
@TypeConverters(mapConverter::class)
abstract class AppDatabase : RoomDatabase() {

    companion object {
        private var sInstance: AppDatabase? = null
        private const val DATABASE_NAME: String = "RatesList"

        fun getInstance(context: Context): AppDatabase {
            if (sInstance == null) {
                synchronized(AppDatabase::class) {
                    sInstance = Room.databaseBuilder(context.applicationContext,
                            AppDatabase::class.java, DATABASE_NAME)
                            .build()
                }
            }
            return sInstance as AppDatabase
        }
    }

    abstract fun ratesDao(): RatesDao
}

1 Ответ

0 голосов
/ 29 мая 2019

Вы пишете свой код на Kotlin, поэтому добавьте эту строку @ JvmStatic в класс mapConverter

class mapConverter {
    @JvmStatic
    @TypeConverter
    fun fromString(value: String): Map<String, Rates> {
       val mapType = object : TypeToken<Map<String, Rates>>() {}.type
       return Gson().fromJson(value, mapType)
    }

    @TypeConverter 
    @JvmStatic
    fun fromStringMap(map: Map<String, Rates>): String {
       val gson = Gson()
       return gson.toJson(map)
    }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...