我有一个实体Memo
类。我使用@TypeConverter
将GregorianCalendar
转换为Long
。
Memo.java
@Entity
public class Memo {
@Ignore
public static final int TYPE_EXPENSE = 0;
@Ignore
public static final int TYPE_INCOME = 1;
@PrimaryKey(autoGenerate = true)
public int id;
public int type;
@ColumnInfo(name = "item_name")
public String itemName;
@ColumnInfo(name = "category_name")
public String categoryName;
public String note;
public double dollar;
public GregorianCalendar date;
public String photoPath;
@Ignore
public Memo(int type) {
this.type = type;
itemName = "";
categoryName = "";
note = "";
dollar = 0d;
date = new GregorianCalendar();
photoPath = "";
}
public Memo() {
this(TYPE_EXPENSE);
}
@Ignore
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("id = " + id);
builder.append(", itemName = " + itemName);
builder.append(", type = " + type);
builder.append(", categoryName = " + categoryName);
builder.append(", note = " + note);
builder.append(", date = " + date.getTimeInMillis());
return builder.toString();
}
}
Converters.java
public class Converters {
@TypeConverter
public static GregorianCalendar fromTimestamp(Long value) {
if (value == null)
return new GregorianCalendar();
else {
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTimeInMillis(value);
return calendar;
}
}
@TypeConverter
public static Long millisToTimestamp(GregorianCalendar calendar) {
return calendar == null ? null : calendar.getTimeInMillis();
}
}
我想获取数据库中的第一条和最后一条记录,并获得MemosWithTimestamp
个对象。
public class MemoWithTimestamp {
public int year;
public int month;
@Embedded
public Memo memo;
@Ignore
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("year=" + year);
builder.append(", month=" + month);
builder.append(", memo=[ "+memo.toString()+"]");
return builder.toString();
}
}
查询方法:
@Query("SELECT *, CAST(strftime('%Y', datetime(date)) AS int) AS year, CAST(strftime('%m', datetime(date)) AS int) AS month FROM memo ORDER BY date DESC LIMIT 1")
MemoWithTimestamp getTheLastMemo();
@Query("SELECT *, CAST(strftime('%Y', datetime(date)) AS int) AS year, CAST(strftime('%m', datetime(date)) AS int) AS month FROM memo ORDER BY date ASC LIMIT 1")
MemoWithTimestamp getTheFirstMemo();
Logcat数据库中的数据:
id = 1, itemName = memo-2015-1-0, type = 0, categoryName = , note = , date = 1422634536401 <=first
....
id = 197, itemName = memo-2017-12-9, type = 0, categoryName = , note = , date = 1515428136414 <=last
Logcat中查询后的结果:
firstMemo= year=0, month=0, memo=[ id = 1, itemName = memo-2015-1-0, type = 0, categoryName = , note = , date = 1422634536401]
lastMemo= year=0, month=0, memo=[ id = 197, itemName = memo-2017-12-9, type = 0, categoryName = , note = , date = 1515428136414]
但是,有或没有CAST
的年份和月份字段总是为0。
如何解决这个问题?
答案 0 :(得分:3)
你错过了两件事:
1)datetime()
函数得到秒,你传递毫秒。将值除以1000。
2)你应该传递第二个参数作为&#39; unixepoch&#39;到datetime()
功能。
因此,您的查询修复如下:
CAST(strftime('%Y', datetime(date/1000, 'unixepoch')) AS int) AS year
同月:
CAST(strftime('%m', datetime(date/1000, 'unixepoch')) AS int) AS month