房间使用日期字段
Room Using Date field
我正在使用日期转换器 class 来转换我的日期对象。但是,我仍然遇到错误提示。错误:无法弄清楚如何将此字段保存到数据库中。可以考虑为其添加类型转换器
我的日期转换器class
public class DateConverter {
@TypeConverter
public static Date toDate(Long dateLong){
return dateLong == null ? null: new Date(dateLong);
}
@TypeConverter
public static long fromDate(Date date){
return date == null ? null :date.getTime();
}
}
我的数据库table 使用日期对象。
@Entity(tableName = "userFitnessDailyRecords")
@TypeConverters(DateConverter.class)
public class UserFitnessDailyRecords {
@NonNull
@PrimaryKey(autoGenerate = true)
public int id;
public Date forDay;
public Date getForDay() {
return forDay;
}
public void setForDay(Date forDay) {
this.forDay = forDay;
}
}
我遵循了 google 代码持久性实验室和公共软件室各自 GitHub 示例中的示例。我正在使用房间版本 1.0.0。
您正在从 Date 转换为 Long(包装器),并从 long(原始)转换为 Date。我将其更改为 Long 并编译。此外,在转换器中对 null 进行拆箱会产生 NPE。
public class DateConverter {
@TypeConverter
public static Date toDate(Long dateLong){
return dateLong == null ? null: new Date(dateLong);
}
@TypeConverter
public static Long fromDate(Date date){
return date == null ? null : date.getTime();
}
}
将转换器 class 放在数据库的 class 中,而不是模型中:
@Database(entities = {
Patient.class,Medicine.class,Tooth.class,})
@TypeConverters({TimeConverter.class,OutBoundConverter.class})
public abstract class PatientDataBase extends RoomDatabase {//your data base}
我遇到了同样的问题(如何将时间存储到 Room),但我使用的是 Calendar
,所以我做了这个:
[注意:这个答案是针对日历的;主要原因是现在支持日历]
编辑:这个答案的主要原因是 Date
已被弃用,所以这里是
@TypeConverter
public static Calendar toCalendar(Long l) {
Calendar c = Calendar.getInstance();
c.setTimeInMillis(l);
return c;
}
@TypeConverter
public static Long fromCalendar(Calendar c){
return c == null ? null : c.getTime().getTime();
}
在 Kotlin 中使用 Calendar
(改编自 O95 的回答):
@TypeConverter
fun toCalendar(l: Long?): Calendar? =
if (l == null) null else Calendar.getInstance().apply { timeInMillis = l }
@TypeConverter
fun fromCalendar(c: Calendar?): Long? = c?.time?.time
查看我的完整示例。
参考文档:https://developer.android.com/training/data-storage/room/referencing-data
public class Converters {
@TypeConverter
public static Date fromTimestamp(Long value) {
return value == null ? null : new Date(value);
}
@TypeConverter
public static Long dateToTimestamp(Date date) {
return date == null ? null : date.getTime();
}
}
然后映射到数据库。
@Database(entities = {User.class}, version = 1)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
和实体。
@Entity
public class User {
private Date birthday;
}
你也可以写在 Kotlin 上
@TypeConverter
fun toDate(dateLong:Long):Date {
return Date(dateLong)
}
@TypeConverter
fun fromDate(date: Date):Long{
return date.time;
}
AndroidThreeTen 是 Java8 新时代 classes 的端口,不幸的是它仅适用于 api>=26。使用 https://github.com/JakeWharton/ThreeTenABP ,我们可以在 Android 的所有版本上使用 LocalDateTime。在 kotlin 转换器中,
class Converters {
@TypeConverter
fun fromTimestamp(value: Long?): LocalDateTime? {
return value?.let {
LocalDateTime.ofInstant(
Instant.ofEpochMilli(it), ZoneId.systemDefault()
)
}
}
@TypeConverter
fun LocalDateTimeToTimestamp(date: LocalDateTime?): Long? {
return date?.atZone(ZoneId.systemDefault())?.toInstant()?.toEpochMilli()
}
}
正如其他好的答案已经说过的那样,它在数据库摘要中声明 class:
@Database(entities = {User.class}, version = 1)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
如果您不想处理自动装箱和拆箱,只需使用原始 long 数据类型,如下所示:
public class DateConverter {
@TypeConverter
public static Date toDate(long date) {
return new Date(date);
}
@TypeConverter
public static long fromDate(Date date) {
return date == null ? Calendar.getInstance().getTimeInMillis() : date.getTime();
}
}
请注意,这会将日期默认为当前日期。
Date
Kotlin 的类型转换器:
class Converters {
@TypeConverter
fun fromTimestamp(value: Long?): Date? {
return value?.let { Date(it) }
}
@TypeConverter
fun dateToTimestamp(date: Date?): Long? {
return date?.time?.toLong()
}
}
下面是如何将它附加到您的数据库:
@Database(entities = [User::class], version = 1)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
我正在使用日期转换器 class 来转换我的日期对象。但是,我仍然遇到错误提示。错误:无法弄清楚如何将此字段保存到数据库中。可以考虑为其添加类型转换器
我的日期转换器class
public class DateConverter {
@TypeConverter
public static Date toDate(Long dateLong){
return dateLong == null ? null: new Date(dateLong);
}
@TypeConverter
public static long fromDate(Date date){
return date == null ? null :date.getTime();
}
}
我的数据库table 使用日期对象。
@Entity(tableName = "userFitnessDailyRecords")
@TypeConverters(DateConverter.class)
public class UserFitnessDailyRecords {
@NonNull
@PrimaryKey(autoGenerate = true)
public int id;
public Date forDay;
public Date getForDay() {
return forDay;
}
public void setForDay(Date forDay) {
this.forDay = forDay;
}
}
我遵循了 google 代码持久性实验室和公共软件室各自 GitHub 示例中的示例。我正在使用房间版本 1.0.0。
您正在从 Date 转换为 Long(包装器),并从 long(原始)转换为 Date。我将其更改为 Long 并编译。此外,在转换器中对 null 进行拆箱会产生 NPE。
public class DateConverter {
@TypeConverter
public static Date toDate(Long dateLong){
return dateLong == null ? null: new Date(dateLong);
}
@TypeConverter
public static Long fromDate(Date date){
return date == null ? null : date.getTime();
}
}
将转换器 class 放在数据库的 class 中,而不是模型中:
@Database(entities = {
Patient.class,Medicine.class,Tooth.class,})
@TypeConverters({TimeConverter.class,OutBoundConverter.class})
public abstract class PatientDataBase extends RoomDatabase {//your data base}
我遇到了同样的问题(如何将时间存储到 Room),但我使用的是 Calendar
,所以我做了这个:
[注意:这个答案是针对日历的;主要原因是现在支持日历]
编辑:这个答案的主要原因是 Date
已被弃用,所以这里是
@TypeConverter
public static Calendar toCalendar(Long l) {
Calendar c = Calendar.getInstance();
c.setTimeInMillis(l);
return c;
}
@TypeConverter
public static Long fromCalendar(Calendar c){
return c == null ? null : c.getTime().getTime();
}
在 Kotlin 中使用 Calendar
(改编自 O95 的回答):
@TypeConverter
fun toCalendar(l: Long?): Calendar? =
if (l == null) null else Calendar.getInstance().apply { timeInMillis = l }
@TypeConverter
fun fromCalendar(c: Calendar?): Long? = c?.time?.time
查看我的完整示例。
参考文档:https://developer.android.com/training/data-storage/room/referencing-data
public class Converters {
@TypeConverter
public static Date fromTimestamp(Long value) {
return value == null ? null : new Date(value);
}
@TypeConverter
public static Long dateToTimestamp(Date date) {
return date == null ? null : date.getTime();
}
}
然后映射到数据库。
@Database(entities = {User.class}, version = 1)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
和实体。
@Entity
public class User {
private Date birthday;
}
你也可以写在 Kotlin 上
@TypeConverter
fun toDate(dateLong:Long):Date {
return Date(dateLong)
}
@TypeConverter
fun fromDate(date: Date):Long{
return date.time;
}
AndroidThreeTen 是 Java8 新时代 classes 的端口,不幸的是它仅适用于 api>=26。使用 https://github.com/JakeWharton/ThreeTenABP ,我们可以在 Android 的所有版本上使用 LocalDateTime。在 kotlin 转换器中,
class Converters {
@TypeConverter
fun fromTimestamp(value: Long?): LocalDateTime? {
return value?.let {
LocalDateTime.ofInstant(
Instant.ofEpochMilli(it), ZoneId.systemDefault()
)
}
}
@TypeConverter
fun LocalDateTimeToTimestamp(date: LocalDateTime?): Long? {
return date?.atZone(ZoneId.systemDefault())?.toInstant()?.toEpochMilli()
}
}
正如其他好的答案已经说过的那样,它在数据库摘要中声明 class:
@Database(entities = {User.class}, version = 1)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
如果您不想处理自动装箱和拆箱,只需使用原始 long 数据类型,如下所示:
public class DateConverter {
@TypeConverter
public static Date toDate(long date) {
return new Date(date);
}
@TypeConverter
public static long fromDate(Date date) {
return date == null ? Calendar.getInstance().getTimeInMillis() : date.getTime();
}
}
请注意,这会将日期默认为当前日期。
Date
Kotlin 的类型转换器:
class Converters {
@TypeConverter
fun fromTimestamp(value: Long?): Date? {
return value?.let { Date(it) }
}
@TypeConverter
fun dateToTimestamp(date: Date?): Long? {
return date?.time?.toLong()
}
}
下面是如何将它附加到您的数据库:
@Database(entities = [User::class], version = 1)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}