如何在领域中使用日历类型

时间:2017-03-15 11:50:11

标签: java android realm

我正在创建一个模型,我试图将gregorian日历值存储在一列中,但它显示我的错误,realmProxcy不支持Calendar Datatype。

private String alarmName;
private Boolean alarmActive = true;
private Date alarmTime;
private String alarmTonePath = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM).toString();
private Boolean alarmVibrate = true;
private  Calendar cal;
  

@PrimaryKey       public int alarmid;

错误:(30,8)错误:不支持字段'cal'的'java.util.Calendar' 我如何存储此日历值并获取它

3 个答案:

答案 0 :(得分:0)

Realm数据库仅支持Date类。您必须将Calendar实例评估为Date个实例。

Calendar cal = Calendar.getInstance();
Date date = cal.getTime(); //save it to realm

来自Realm文档:

  

Realm支持以下字段类型:boolean,byte,short,int,long,float,double,String, Date 和byte []。整数类型byte,short,int和long都映射到Realm中的相同类型(实际上很长)。此外,支持RealmObject和RealmList的子类来建模关系。

https://realm.io/docs/java/latest/#field-types

答案 1 :(得分:0)

使用Date from calendar.getTime()代替Calendar,如果需要,将Calendar对象转换器存储到其他类型进行保存和读取转换。例如:

public static Calendar toCalendarFromDate(Date date){ 
  Calendar cal = Calendar.getInstance();
  cal.setTime(date);
  return cal;
}

答案 2 :(得分:0)

如果确实需要存储Calendar实例,您可以利用它Serializable并在Realm中存储byte[]数组的可能性对象 - 序列化您的Calendar到字节数组进行存储,并在访问数据时从字节数组反序列化

你的对象看起来像这样:

class MyRealmObject extends RealmObject {
    private String alarmName;
    private Boolean alarmActive = true;
    private Date alarmTime;
    private String alarmTonePath = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM).toString();
    private Boolean alarmVibrate = true;
    private byte[] serializedCalendar;

    public Calendar getCalendar() {
        return deserializeCalendar(serializedCalendar);
    }

    public void setCalendar(Calendar calendar) {
        this.serializedCalendar = serializeCalendar(calendar);
    }
}

关于如何实施方法,请参阅Object<> byte[]序列化/反序列化的this answer

byte[] serializeCalendar(Calendar c);
Calendar deserializeCalendar(byte[] arr);