【问题标题】:Android Room Persistence Library TypeConverter unknown issueAndroid Room Persistence Library TypeConverter 未知问题
【发布时间】:2018-02-02 13:24:57
【问题描述】:

我很难将我的实体保存到房间持久性数据库中。据我了解,RPL(RoomPersistenceLibrary)将只接受原始类型,所以我需要将我的两个字段:Calendar mStartDateCalendar mEndTime 转换为使用 Typeconverters 的字符串(这两个字段都用于设置开始和结束日期 - 分钟、小时,day,month,year 每次我创建 WeekViewEvent's - 请参阅构造函数。

所以我创建了一个,但它仍然有问题,因为 Android Studio 不断向我显示相同的错误: 无法弄清楚如何将此字段保存到数据库中(..) 由于控制台不显示代码行,我无法追踪错误。

有什么想法我可能做错了吗? 预先感谢您的任何帮助! :)

WeekViewEvent.class:

@Entity
public class WeekViewEvent implements Serializable {

@NonNull
@PrimaryKey
private long mId;
private String mName;
private String mLocation;
private int mColor;
private boolean mAllDay;
private Shader mShader;
private String Identifier;

@TypeConverters({WeekViewEventCONVERTER.class})
private Calendar mStartTime;
@TypeConverters({WeekViewEventCONVERTER.class})
private Calendar mEndTime;


public WeekViewEvent(long id, String name, String location, String identifier, int color, int startYear, int startMonth, int startDay, int startHour, int startMinute, int endYear, int endMonth, int endDay, int endHour, int endMinute) {
    this.mId = id;
    this.mStartTime = Calendar.getInstance();
    this.mStartTime.set(Calendar.YEAR, startYear);
    this.mStartTime.set(Calendar.MONTH, startMonth - 1);
    this.mStartTime.set(Calendar.DAY_OF_MONTH, startDay);
    this.mStartTime.set(Calendar.HOUR_OF_DAY, startHour);
    this.mStartTime.set(Calendar.MINUTE, startMinute);
    this.mEndTime = Calendar.getInstance();
    this.mEndTime.set(Calendar.YEAR, endYear);
    this.mEndTime.set(Calendar.MONTH, endMonth - 1);
    this.mEndTime.set(Calendar.DAY_OF_MONTH, endDay);
    this.mEndTime.set(Calendar.HOUR_OF_DAY, endHour);
    this.mEndTime.set(Calendar.MINUTE, endMinute);
    this.mName = name;
    this.Identifier = identifier;
    this.mLocation = location;
    this.mColor = color;}
...
}

WeekViewEventCONVERTER.class:

 @TypeConverter
public static Calendar fromString (String value){
    Type calendarType = new TypeToken<Calendar>() {}.getType();
    return new Gson().fromJson(value, calendarType);
}

@TypeConverter
public static String fromCalendar (Calendar mStartTime){
    Gson gson = new Gson();
    String json = gson.toJson(mStartTime);
    return json;
}

}

和 WeekViewEventDAO:

@Dao
public interface WeekViewEventDAO {

@Insert(onConflict = OnConflictStrategy.REPLACE)
public long insertWeekViewEvent (WeekViewEvent event);

@Update(onConflict = OnConflictStrategy.REPLACE)
public void updateWeekViewEvent (WeekViewEvent event);

@Delete
public void deleteWeekViewEvent (WeekViewEvent event);

@Query("DELETE FROM WeekViewEvent")
public void deleteAllWeekViewEvents();

@Query("SELECT * FROM WeekViewEvent")
WeekViewEvent getWeekViewEvent();

@Query("SELECT * FROM WeekViewEvent")
public List<WeekViewEvent> getAllWeekVieweventsList();}

【问题讨论】:

  • much 更有效的方法可以将 Calendar 转换为有效的列类型,例如使用 milliseconds-since-the-Unix-epoch 值(例如, getTimeAsMillis())。除此之外......为什么一个既是Serializable又应该进入数据库的对象首先有一个Shader?如果Shaderthis Shader,那是属于 UI 层的东西,而不是数据表示层。
  • 没想过将其转换为毫秒 - 好主意!说实话,它是一个库,我不使用 Shader 字段(是的,我们正在谈论的 Shader 就是那个 Shader):) 谢谢你的帮助!

标签: java android


【解决方案1】:

我认为您的问题是您没有此字段的类型转换器:

private Shader mShader;

尝试添加@Ignore 将其标记为非持久性。

【讨论】:

  • 忽略着色器 mShader 完成了这项工作!谢谢你,达尼尔!祝你有美好的一天! :)
  • @Matt 但是如果我想让 Shader 类持久化,我该如何制作一个转换器
猜你喜欢
  • 1970-01-01
  • 2018-06-19
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
  • 2018-03-28
  • 2017-11-08
  • 1970-01-01
相关资源
最近更新 更多