【发布时间】: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