0

値オブジェクトの一部として DateTime オブジェクトと Duration を保持する方法を探しています。

これが私の値オブジェクトです:

@DatabaseTable(tableName = DrivingRecord.TableName)
public class DrivingRecord {
    public final static String TableName = "drivingRecord";
    public final static String DRIVING_TASK_COLUMN_NAME = "drivingTask";

    @DatabaseField(foreign = true, columnName = DRIVING_TASK_COLUMN_NAME)
    private DrivingTask drivingTask;

    @DatabaseField(generatedId = true)
    private int id;

    @DatabaseField(dataType = DataType.LONG)
    private DateTime startTime;

    @DatabaseField
    private Duration durationOfDriving;
}

次の例外が発生します。

java.lang.IllegalArgumentException: Field class org.joda.time.Duration for field FieldType:name=durationOfDriving,class=DrivingRecord is not valid for type com.j256.ormlite.field.types.LongType@41223060, maybe should be long

DateTime のエントリを作成しようとすると、同じ例外が発生します

4

3 に答える 3

2
java.lang.IllegalArgumentException: Field class org.joda.time.Duration for
    field FieldType:name=durationOfDriving,class=DrivingRecord is not valid for
    type com.j256.ormlite.field.types.LongType@41223060, maybe should be long

Durationこのメッセージは、フィールドdurationOfDrivingが date-type と互換性がないことを伝えようとしていますDataType.LONG。あなたが投稿したコードが正しくないかどうかはわかりませんが、あなたがやろうとしていると思っていたでしょう:

@DatabaseField(dataType = DataType.LONG)
private Duration durationOfDriving;

ORMLiteは、.a の永続化をネイティブにサポートしていますが、サポートしてDateTimeいませんDuration。強制的に長くしようとするだけではうまくいきません。の顧客パーシスタを定義する必要がありますDuration

独自の永続化を開始する方法については、カスタム永続化に関するドキュメントを確認してください。

別の例については、この回答を確認することもできます: DataType.SERIALIZABLE で宣言されたフィールドが Serializable を実装しているという ORMLite のチェックを無効にする方法はありますか?

于 2013-04-08T17:27:22.267 に答える
1

これは、私が問題を解決できたことを示しています。タイムスタンプを長くして、タイムゾーンを保存します。必要に応じて、タイムスタンプを検索できるようになりました。

@DatabaseTable(tableName = DrivingRecord.TableName)
public class DrivingRecord {
    public final static String TableName = "drivingRecord";
    public final static String DRIVING_TASK_COLUMN_NAME = "drivingTask";

    @DatabaseField(foreign = true, columnName = DRIVING_TASK_COLUMN_NAME)
    private DrivingTask drivingTask;

    @DatabaseField(generatedId = true)
    private int id;

    @DatabaseField(dataType = DataType.LONG)
    private long startTime;

    @DatabaseField
    private Duration durationOfDriving;

    @DatabaseField(canBeNull = false, dataType= DataType.SERIALIZABLE)
    private DateTimeZone timeZone;

    public void setDateTime(DateTime dateTime){
        this.startTime = startTime.getMillis();
        this.timeZone = startTime.getZone();
    }

    public DateTime getDateTime(){
        return new DateTime(startTime, timeZone);
    }

}
于 2013-04-07T14:43:56.360 に答える
0

JodaTime は ORMLite では動作しませんが、ORMLite で動作する Java Date を使用できます。JodaTime と Date の間で変換する方法も多数あります。

@DatabaseField
protected Date createdAt;

public static String formatDateTime(DateTime dateTime1) {
    if (dateTime1 == null || dateTime1.getYear() == 0) {
        return "";
    }
    DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, ApplicationBase.AppContext.getResources().getConfiguration().locale);
    Calendar calendar02 = new GregorianCalendar(dateTime1.getYear(), dateTime1.getMonthOfYear() - 1, dateTime1.getDayOfMonth());
    Date date3 = calendar02.getTime();
    String date3str = DataItemBase.formatDate(date3);
    return date3str;
}
于 2016-03-26T01:42:01.453 に答える