【问题标题】:Android room save custom typeAndroid房间保存自定义类型
【发布时间】:2018-07-24 10:31:04
【问题描述】:

我尝试在房间数据库中保存自定义类型。我总是收到错误

错误:无法确定如何将此字段保存到数据库中。您可以考虑为其添加类型转换器。

我为 OutboxItemCache 创建了转换器

我的实体

@Entity(tableName = "request")
class RequestCache(
    @ColumnInfo(name = "requestId")
    @PrimaryKey var id: String = "",
    @TypeConverters(RequestConverter::class)
    var outboxItemCache: OutboxItemCache)

我的请求转换器

class RequestConverter {
companion object {
    private val gson = Gson()

    @TypeConverter
    fun stringToOutboxItem(string: String): OutboxItemCache? {
        if (TextUtils.isEmpty(string))
            return null
        return gson.fromJson(string, OutboxItemCache::class.java)
    }

    @TypeConverter
    private fun outboxItemToString(outboxItem: OutboxItemCache): String {
        return gson.toJson(outboxItem)
    }

}
}

这是我的班级 OutboxItemCache

class OutboxItemCache(
    var id: String = "",
    val numder: String,
    date: String,
    val headerDate: String,
    name: String,
    val certCount: String,
    val status: String,
    val statusColor: Int,
    var statusInfo: String? = null,
    val vetCertIds: List<String>
  )

错误从未消失

【问题讨论】:

  • 您是否将 @TypeConverters({RequestConverter.class}) 添加到您的 AppDatabase 类中?

标签: android android-room


【解决方案1】:

根据google's documentation

@Database(entities = {User.class}, version = 1)
@TypeConverters({RequestConverter.class})
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}

您需要将您的 TypeConverters 注册到您的数据库类。

编辑:

在科特林中:

@Database(entities = arrayOf(User::class), version = 1)
@TypeConverters(RequestConverter::class)
abstract class AppDatabse : RoomDatabase() {
    abstract fun userDAO(): UserDAO    
}

这里唯一对你重要的代码行是

@TypeConverters(RequestConverter::class)

因为你应该已经拥有其他人了。

编辑 2:

尝试如下编写转换器类:

class RequestConverter {
@TypeConverter
fun stringToOutboxItem(string: String): OutboxItemCache? {
    if (TextUtils.isEmpty(string))
        return null
    return Gson().fromJson(string, OutboxItemCache::class.java)
}

@TypeConverter
private fun outboxItemToString(outboxItem: OutboxItemCache): String {
    return Gson().toJson(outboxItem)
}

【讨论】:

  • 因为它会写在 kotlin 上?
  • 我在数据库中注册了转换器。获取新错误:RequestConverter.java:6: 错误:类被引用为转换器,但它没有任何转换器方法。
  • 您是否尝试公开您的 RequestConverter.class 方法?
猜你喜欢
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
相关资源
最近更新 更多