ORMLite问题。我有一组POJO,Android应用程序和Java web服务都使用它们来持久化数据(分别保存到SQLite和MariaDB )。从5.3开始,我相信,MariaDB支持带有长度的时间戳/日期时间,这将字段的精度扩展到微秒(MySQL本身在新的开发版本5.6中支持这一点)。
但是,即使我从命令行手动修改日期字段以将列设置为DATETIME(6),我也无法让ORMLite以毫秒精度保存日期字段。我知道我可以在POJO中使用DATE_LONG或DATE_STRING的dataType,但我希望在MariaDB中使用实际的DATETIME类型。
有没有什么方法可以做到毫秒级的精度?
发布于 2013-02-19 12:44:30
看看问题下面的注释,以了解发生了什么,你需要一个新的DatabaseType (如果使用MariaDB,那么显然只需继承MySQL one):
public class MariaDBType extends MysqlDatabaseType {
private final static String DATABASE_URL_PORTION = "mysql";
private final static String DRIVER_CLASS_NAME = "org.mariadb.jdbc.Driver";
private final static String DATABASE_NAME = "MariaDB";
@Override
public boolean isDatabaseUrlThisType(String url, String dbTypePart) {
return DATABASE_URL_PORTION.equals(dbTypePart);
}
@Override
protected String getDriverClassName() {
return DRIVER_CLASS_NAME;
}
@Override
public String getDatabaseName() {
return DATABASE_NAME;
}
@Override
protected void appendDateType(StringBuilder sb, FieldType fieldType, int fieldWidth) {
/**
* TIMESTAMP in MySQL does some funky stuff with the last-modification time. Values are 'not null' by default
* with an automatic default of CURRENT_TIMESTAMP. Strange design decision.
*/
if (isDatetimeFieldWidthSupported()) {
sb.append("DATETIME(").append(fieldWidth).append(")");
} else {
sb.append("DATETIME");
}
}
public boolean isDatetimeFieldWidthSupported() {
return true;
}
}现在我可以像平常一样使用日期宽度,并获得毫秒或微秒宽度。在我的例子中,我使用了格雷现有的dataType注解参数来表示宽度(对于像这样的情况很好,我只需要毫秒精度,而不是微秒)。
@DatabaseField(columnName = Constants.TIMESTAMP, dataType = DataType.DATE, width = 3)
private Date timestamp;最后,如果您正在尝试解决此特定问题,请不要忘记小数秒标志:
private static JdbcPooledConnectionSource cSource = new JdbcPooledConnectionSource();
cSource.setDatabaseType(new MariaDBType());
cSource.setUrl("jdbc:mysql://localhost:3306/database?useFractionalSeconds=true");
cSource.setUsername("username");
cSource.setPassword("password");https://stackoverflow.com/questions/14947832
复制相似问题