添加 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
。
找了好久,一头雾水。我的应用程序进行了一些相当常规的 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
。