1

ORMLiteの質問。AndroidアプリとJavaWebサービスの両方でデータを永続化するために使用されるPOJOのセットがあります(それぞれSQLiteとMariaDBに)。5.3以降、MariaDBは、フィールドの精度をマイクロ秒に拡張する長さのタイムスタンプ/日時をサポートしていると思います(MySQL自体が新しいdev 5.6リリースでこれをサポートしています)。

ただし、コマンドラインから手動でフィールドを変更して列をDATETIME(6)に設定した場合でも、ORMLiteで日付フィールドをミリ秒の精度で永続化することができませんでした。POJOでDATE_LONGまたはDATE_STRINGのdataTypeを使用できることは理解していますが、MariaDBでは実際のDATETIME型を使用したいと思います。

ミリ秒の精度でこれを行う方法はありますか?

4

1 に答える 1

1

ここで何が起こっているのかを理解するために、質問の下のコメントを見てください...基本的に、新しいDatabaseTypeが必要です(MariaDBを使用している場合は、明らかにMySQLをサブクラス化するだけです)。

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");
于 2013-02-19T04:44:30.217 に答える