【问题标题】:Adding Date TypeConverter causes Room to fail storing API results添加 Date TypeConverter 导致 Room 无法存储 API 结果
【发布时间】:2021-11-24 09:03:32
【问题描述】:

我找了好久,不知所措。我的应用程序进行了一些相当常规的 API 调用并将结果存储在 Room DB 中,这一切都可以完美运行,直到我尝试通过更改我的一个类/表中的参数的数据类型来将 TypeConverter 用于日期字段。问题是我没有收到任何错误,它只是在我切换类型的那一刻没有在 Room 数据库中存储任何数据。我发誓我已经根据我所阅读和看到的所有内容正确地实现了这一点,我在我的 API 返回时使用模拟数据测试了转换器函数并且它正在工作。我似乎无法弄清楚 Room 正在做什么以及哪里出了问题。

这是我的数据类的相关部分,如果 dateAdded 被声明为字符串?一切正常:

import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
import com.google.gson.annotations.SerializedName
import java.util.*

@Entity
data class Cocktail (
    ...
    @ColumnInfo(name = "date_added")
    @SerializedName("dateadded")
    val dateAdded: Date?
)

API 返回:

[
   {
      ...
      "dateadded": "2020-04-03 13:15:56"
   }
]

数据库:

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import com.goodcall.goodcall.data.models.*

@Database(
    entities = arrayOf(
        Cocktail::class,
        CocktailRecipe::class,
        CocktailIngredient::class,
        IngredientType::class,
        Lists::class,
        ListsDrinksItems::class
    ),
    version = 1,
    exportSchema = false
)
@TypeConverters(Converters::class)
abstract class GoodCallDatabase : RoomDatabase() {
    abstract fun goodCallDao(): GoodCallDao

    companion object {
        @Volatile private var instance: GoodCallDatabase? = null
        private val LOCK = Any()

        operator fun invoke(context: Context) = instance ?: synchronized(LOCK) {
            instance ?: buildDatabase(context).also {
                instance = it
            }
        }
        private fun buildDatabase(context: Context) = Room.databaseBuilder(
            context.applicationContext,
            GoodCallDatabase::class.java,
            "goodcalldatabase.db"
        )
            .build()
    }
}

转换器类:

import androidx.room.TypeConverter
import java.text.SimpleDateFormat
import java.util.*

class Converters {
    @TypeConverter
    fun fromTimestampStr(timeStamp: String?): Date? {
        if(timeStamp == null){
            return null
        } else {
            val date = SimpleDateFormat("YYYY-MM-dd HH:mm:ss").parse(timeStamp)
            return date
        }
    }
    @TypeConverter
    fun toTimestampStr(date: Date?): String? {
        if(date == null){
            return null
        } else {
            val format = SimpleDateFormat("YYYY-MM-dd HH:mm:ss")
            return format.format(date)
        }
    }
}

在这里感谢任何和所有帮助,我几乎是 Android 新手,所以希望这是一个简单的修复。

【问题讨论】:

    标签: android kotlin android-room


    【解决方案1】:

    我认为您的问题不在于 Room,您是否将 DateDeserializer 添加到您的 GsonBuilder 中?
    Kotlin

    class DateDeserializer : JsonDeserializer<Date> {
    
    @Throws(JsonParseException::class)
    override fun deserialize(
        json: JsonElement,
        typeOfT: Type,
        context: JsonDeserializationContext
    ): Date {
    }}
    

    Java

    public class DateDeserializer implements JsonDeserializer<Date> {
    
    public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
    }}
    

    如果实现了这一点,我建议将您的文件签名从 class 更改为 object

    【讨论】:

    • 太棒了,感谢 Amjad - 这为我解决了这个问题!对于任何关注并需要 kotlin 版本的 Amjad 解决方案的人,我在这里找到了它:stackoverflow.com/questions/18473011/…
    猜你喜欢
    • 1970-01-01
    • 2022-01-16
    • 2018-01-18
    • 2018-03-28
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多