【问题标题】:error: Cannot figure out how to save this field into database. You can consider adding a type converter for it. in my app?错误:无法弄清楚如何将此字段保存到数据库中。您可以考虑为其添加类型转换器。在我的应用程序中?
【发布时间】:2020-04-02 07:23:33
【问题描述】:

我正在开发新闻应用程序,但出现以下错误 错误:无法弄清楚如何将此字段保存到数据库中。您可以考虑为其添加类型转换器。 private final yodgorbek.komilov.musobaqayangiliklari.model.Source source = null;

在我实现数据库的 SportNewsDatabase.kt 类下方

@Database(entities = [Article::class], version = 1, exportSchema = false)
abstract class SportNewsDatabase : RoomDatabase() {

    abstract fun sportNewsDao(): SportNewsDao

    companion object {
        private var instance: SportNewsDatabase? = null
        fun getInstance( context: Context): SportNewsDatabase? {
            if (instance == null) {
                synchronized(SportNewsDatabase::class.java) {
                    instance = Room.databaseBuilder(context.applicationContext, SportNewsDatabase::class.java, "article_database")
                        .fallbackToDestructiveMigration()
                        .build()
                }
            }
            return instance
        }
    }


}

在 SportNewsDao.kt 下方

interface SportNewsDao {

    @Query("SELECT * FROM  article")
    fun getAllData(): LiveData<List<Article>>

    @Insert
    suspend fun addAll(article: List<Article>)


    @Update
    suspend fun updateArticle(article: Article)

    @Delete
    suspend fun deleteArticle(article: Article)

}

在 Article.kt 下方

@Entity(tableName = "article")

    data class Article(
        @ColumnInfo(name = "author") val author: String,
        val content: String,
        val description: String,
        var publishedAt: String,
        val source: Source,
        val title: String,
        val url: String,
        val urlToImage: String
    )

在 Source.kt 下

data class Source(
    val id: Any?,
    val name: String
) {

}

在我尝试进行转换的 SourceTypeConverters.kt 下方

object SourceTypeConverters {
    @TypeConverter
    fun ConvertSource(source: Source?): String? {
        return source?.toString()
    }

    @TypeConverter
    fun ConvertSource(source: String?): Source? {
        return source?.let { Source(it) }
    }
}

我想知道我在哪里犯了错误我必须做什么才能避免我的应用程序出错。

【问题讨论】:

  • 这不是使用数据库的正确方法。您应该为 Source 创建另一个表并使用外键约束。但是如果你想使用类型转换器将其转换为 JSON 并使用 gson 转换器检索它。

标签: android kotlin android-room typeconverter


【解决方案1】:

typeConvertor 似乎有点不对劲。而不是对象,让它成为一个类。以 JSON 字符串形式存储在数据库中并检索它(GSON 库可选)。

class SourceTypeConverter {
    @TypeConverter
    fun fromSource(source: Source): String {
        return JSONObject().apply { 
            put("id", source.id)
            put("name", source.name)
        }.toString()
    }

    @TypeConverter
    fun toSource(source: String): Source {
        val json = JSONObject(source)
        return Source(json.get("id"), json.getString("name"))
    }
}

现在将此 TypeConvertor 注册到带有注释 TypeConverter 的数据库。

@Database(entities = [Article::class], version = 1, exportSchema = false)
@TypeConverters(SourceTypeConverter::class)
abstract class SportNewsDatabase : RoomDatabase() {
      /* your code here */
}

【讨论】:

  • @感谢 Nataraj KR 的回答我希望你是安全的
猜你喜欢
  • 2020-04-27
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-15
  • 2021-11-04
  • 2019-05-17
  • 1970-01-01
相关资源
最近更新 更多