我是 ORMLite 的新手,在访问 SQLite 数据库时遇到了同样的问题。
今天花了一整天的时间才弄明白,总结如下:
我发现格式“yyyy-Md H:m:s”在 ORMLite 中可以很好地处理 SQLite DateTime 数据类型,而不是 ORMLite 的默认格式“yyyy-MM-dd HH:mm:ss.SSSSS”。
为了让 ORMLite 在“Java Date”和“SQLite DateTime”之间进行转换,需要一个持久化类。
这里显示了我使用的持久类的代码,它覆盖了 DateStringType 的公共函数并使用 "dateFormatConfig" 而不是 defaultDateFormatConfig" :
`
public class DateStringSQLiteType extends DateStringType {
protected static final DateStringFormatConfig dateFormatConfig = new DateStringFormatConfig(
"yyyy-M-d H:m:s");
private static final DateStringSQLiteType singleTon = new DateStringSQLiteType();
public static DateStringSQLiteType getSingleton() {
return singleTon;
}
private DateStringSQLiteType() {
super(SqlType.STRING, new Class<?>[0]);
}
/**
* Convert a default string object and return the appropriate argument to a
* SQL insert or update statement.
*/
@Override
public Object parseDefaultString(FieldType fieldType, String defaultStr)
throws SQLException {
DateStringFormatConfig formatConfig = convertDateStringConfig(
fieldType, dateFormatConfig);
try {
// we parse to make sure it works and then format it again
return normalizeDateString(formatConfig, defaultStr);
} catch (ParseException e) {
throw SqlExceptionUtil.create("Problems with field " + fieldType
+ " parsing default date-string '" + defaultStr
+ "' using '" + formatConfig + "'", e);
}
}
/**
* Return the SQL argument object extracted from the results associated with
* column in position columnPos. For example, if the type is a date-long
* then this will return a long value or null.
*
* @throws SQLException
* If there is a problem accessing the results data.
* @param fieldType
* Associated FieldType which may be null.
*/
@Override
public Object resultToSqlArg(FieldType fieldType, DatabaseResults results,
int columnPos) throws SQLException {
return results.getString(columnPos);
}
/**
* Return the object converted from the SQL arg to java. This takes the
* database representation and converts it into a Java object. For example,
* if the type is a date-long then this will take a long which is stored in
* the database and return a Date.
*
* @param fieldType
* Associated FieldType which may be null.
* @param sqlArg
* SQL argument converted with
* {@link #resultToSqlArg(FieldType, DatabaseResults, int)} which
* will not be null.
*/
@Override
public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos)
throws SQLException {
String value = (String) sqlArg;
DateStringFormatConfig formatConfig = convertDateStringConfig(
fieldType, dateFormatConfig);
try {
return parseDateString(formatConfig, value);
} catch (ParseException e) {
throw SqlExceptionUtil.create("Problems with column " + columnPos
+ " parsing date-string '" + value + "' using '"
+ formatConfig + "'", e);
}
}
/**
* Convert a Java object and return the appropriate argument to a SQL insert
* or update statement.
*/
@Override
public Object javaToSqlArg(FieldType fieldType, Object obj) {
DateFormat dateFormat = convertDateStringConfig(fieldType,
dateFormatConfig).getDateFormat();
return dateFormat.format((Date) obj);
}
/**
* @throws SQLException
* If there are problems creating the config object. Needed for
* subclasses.
*/
@Override
public Object makeConfigObject(FieldType fieldType) {
String format = fieldType.getFormat();
if (format == null) {
return dateFormatConfig;
} else {
return new DateStringFormatConfig(format);
}
}
}
`
用符号定义你的数据类:
@DatabaseField(..., persisterClass = DateStringSQLiteType.class)
private Date date;
它对我来说效果很好,可以执行“Between”查询,例如:
list = foo.getDao().queryBuilder().where().between(HistoryStandardView.DATE_FIELD_NAME, new Date(98,1,1), new Date(115,1,1)).query();
ORMLite 的记录器显示结果语句:
[DEBUG] StatementExecutor 查询 'SELECT * FROM `HistoryStandardView` WHERE `date` BETWEEN '1998-2-1 0:0:0' AND '2015-2-1 0:0:0' ' 返回 2 个结果