【问题标题】:How to Save the HashMap in Room database without using JSON & GSON?如何在不使用 JSON 和 GSON 的情况下将 HashMap 保存在 Room 数据库中?
【发布时间】:2020-01-01 07:28:27
【问题描述】:

我试图在 HashMap 中存储地址,但编译器给出了错误: 无法弄清楚如何将此字段保存到数据库中。您可以考虑为其添加类型转换器。私有 java.util.HashMap 地址;

 error: 
    Cannot figure out how to save this field into database. You can consider adding a type converter for it. private java.util.HashMap<java.lang.String, java.lang.String> address;

我正在使用 MapTypeConverter,但它不起作用

object MapTypeConverter {

    @TypeConverter
    @JvmStatic
    fun stringToMap(value: JsonElement): Map<String, String> {
        return Gson().fromJson(value,  object : TypeToken<Map<String, String>>() {}.type)
    }

    @TypeConverter
    @JvmStatic
    fun mapToString(value: Map<String, String>?): String {
        return if(value == null) "" else Gson().toJson(value)
    }
}   

房间实体

@Entity
data class User(
    var ownerName: String? = null,
    var shopNumber: String? = null,
    var deviceToken: String? = null,
    var altNumber: String? = null,
    var address: Map<String, String>? = null
) {
    @PrimaryKey(autoGenerate = false)
    var uId: String = "NA"
}

应用数据库

@Database(
    entities = [User::class,ProductDetails::class,CategoryDetails::class],
    version = 1
)
@TypeConverters(ConverterListToString::class,MapTypeConverter::class)
abstract class AppDatabase : RoomDatabase(){

    abstract fun getUserDao(): UserDao
    abstract fun getProductDao(): ProductDao
    abstract fun getCategoryDao(): CategoryDao

    companion object{

        @Volatile
        private var instance: AppDatabase? = null
        private val LOCK = Any()

        operator fun invoke(context: Context) = instance ?: synchronized(LOCK){
            instance ?: buildAppDataBase(context).also {
                instance = it
            }
        }

        private fun buildAppDataBase(context: Context) =
            Room.databaseBuilder(
                context.applicationContext,
                AppDatabase::class.java,
                 "TradersDatabase.db"
            ).build()
    }
}

【问题讨论】:

  • 代码在哪里?总是在问题中添加一些实现。
  • 我只是添加我的实现
  • 你得到的错误是什么?
  • 我收到此错误:无法弄清楚如何将此字段保存到数据库中。您可以考虑为其添加类型转换器。私有 java.util.Map 地址;
  • 你能把你的Entity 类的room 展示一下吗

标签: android android-room


【解决方案1】:

使用String 而不是JsonElement

object MapTypeConverter {

    @TypeConverter
    @JvmStatic
    fun stringToMap(value: String): Map<String, String> {
        return Gson().fromJson(value,  object : TypeToken<Map<String, String>>() {}.type)
    }

    @TypeConverter
    @JvmStatic
    fun mapToString(value: Map<String, String>?): String {
        return if(value == null) "" else Gson().toJson(value)
    }
}   

你的Entity应该是这样的

@Entity
data class User(
    var ownerName: String? = null,
    var shopNumber: String? = null,
    var deviceToken: String? = null,
    var altNumber: String? = null,

    @TypeConverters(MapTypeConverter::class)
    var address: Map<String, String>? = null
) {
    @PrimaryKey(autoGenerate = false)
    var uId: String = "NA"
}

【讨论】:

  • 我已经尝试过了,但这也不起作用并给出同样的错误
  • 错误:无法弄清楚如何将此字段保存到数据库中。您可以考虑为其添加类型转换器。私有 java.util.HashMap 地址;
  • 还将@TypeConverters(MapTypeConverter::class)var address: Map&lt;String, String&gt;? = null添加到您的字段
【解决方案2】:

你需要添加转换到你的entity

@Entity
data class User(
    var ownerName: String? = null,
    var shopNumber: String? = null,
    var deviceToken: String? = null,
    var altNumber: String? = null,
    @TypeConverters(MapTypeConverter::class)
    var address: Map<String, String>? = null
) {
    @PrimaryKey(autoGenerate = false)
    var uId: String = "NA"
}

您需要在stringToMap函数中将JsonElement更改为String

希望对你有所帮助。

【讨论】:

  • 好的,你没有先在问题中添加它。
  • 你的typeConverter转换方法有问题。
  • 是的,我想是的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
  • 2013-02-11
  • 2019-04-25
相关资源
最近更新 更多