添加 Date TypeConverter 导致 Room 无法存储 API 个结果

Adding Date TypeConverter causes Room to fail storing API results

找了好久,一头雾水。我的应用程序进行了一些相当常规的 API 调用并将结果存储在 Room DB 中,这一切都非常有效,直到我尝试通过更改我的 classes/tables。问题是我没有收到任何错误,只是在我切换类型时没有在 Room 数据库中存储任何数据。我发誓我已经根据我读过和看到的所有内容正确地实现了这个,我用模拟数据测试了转换器函数作为我的 API returns 并且它正在工作。我似乎无法弄清楚 Room 在做什么以及它在哪里崩溃了。

这是我数据的相关部分 class,如果 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 returns:

[
   {
      ...
      "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()
    }
}

转换器class:

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 的新手,所以希望这是一个简单的修复。

我认为您的问题不在于房间,您是否将 DateDeserializer 添加到您的 GsonBuilder
科特林

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