【问题标题】:Room Using Date field房间使用日期字段
【发布时间】:2018-10-23 02:56:25
【问题描述】:

我正在使用日期转换器类来转换我的日期对象。但是,我仍然遇到错误说。错误:无法弄清楚如何将此字段保存到数据库中。您可以考虑为其添加类型转换器。

我的日期转换器类

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();
    }
}

用于使用日期对象的我的数据库表。

@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 代码持久性实验室和 commonwares room 各自 GitHub 示例的示例。我正在使用房间版本 1.0.0。

【问题讨论】:

  • 对我来说最好的方法是使用 Gson() 将其转换为字符串,反之亦然。您可以使用任何类型的对象进行 Gson 转换。

标签: android android-room android-database android-date


【解决方案1】:

您正在从 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();
    }
}

【讨论】:

    【解决方案2】:

    查看我的完整示例。

    参考文档: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;
    }
    

    【讨论】:

    【解决方案3】:

    我遇到了同样的问题(如何将时间存储到 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();
      }
    

    【讨论】:

      【解决方案4】:

      将转换器类放在数据库类中,而不是在模型中:

      @Database(entities = {
          Patient.class,Medicine.class,Tooth.class,})
      
      @TypeConverters({TimeConverter.class,OutBoundConverter.class})
      
      public abstract class PatientDataBase extends RoomDatabase {//your data base}
      

      【讨论】:

        【解决方案5】:

        AndroidThreeTen 是 Java8 新时间类的端口,遗憾的是仅适用于 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()
            }
        }
        

        正如其他好的答案已经说过的那样,它是在数据库抽象类中声明的:

        @Database(entities = {User.class}, version = 1)
        @TypeConverters({Converters.class})
        public abstract class AppDatabase extends RoomDatabase {
            public abstract UserDao userDao();
        }
        

        【讨论】:

          【解决方案6】:

          如果您不想处理自动装箱和拆箱,只需使用原始 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();
            }
          }
          

          请注意,这会将日期默认为当前日期。

          【讨论】:

            【解决方案7】:

            Calendar 与 Kotlin 一起使用(改编自 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
            

            【讨论】:

              【解决方案8】:

              你也可以在 Kotlin 上写它

              @TypeConverter
              fun toDate(dateLong:Long):Date {
                  return Date(dateLong)
              }
              
              @TypeConverter
              fun fromDate(date: Date):Long{
                  return date.time;
              }
              

              【讨论】:

                【解决方案9】:

                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
                }
                

                复制自official docs

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2016-09-30
                  • 1970-01-01
                  • 2019-05-26
                  • 2013-02-20
                  • 2019-08-18
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-04-20
                  相关资源
                  最近更新 更多