mysql - قضايا أورليميت على الخلية خلق الطوابع الزمنية



timestamp ormlite (1)

الآن هناك لا تبدو أن تكون وسيلة لتحقيق ذلك إلا باستخدام @DatabaseFiled(version = true) التي لا تعمل الحقول @DatabaseFiled(version = true) . وقد تم علاج هذا في الجذع، وسوف تعمل في 4.46:

http://ormlite.com/docs/version-field

للحصول عليه للعمل مع الحقول الطابع الزمني في 4.45 جميلة على الرغم من كل. ستحتاج إلى extends TimeStampType وتجاوز الطريقة التالية. انظر الجزء السفلي من هذه الإجابة لمزيد من التفاصيل:

@Override
public Object moveToNextValue(Object currentValue) {
    long newVal = System.currentTimeMillis();
    if (currentValue == null) {
        return new java.sql.Timestamp(newVal);
    } else if (newVal == ((java.sql.Timestamp) currentValue).getTime()) {
        return new java.sql.Timestamp(newVal + 1L);
    } else {
        return new java.sql.Timestamp(newVal);
    }
}

ثم حدد الحقل الخاص بك على النحو التالي:

@DatabaseField(persisterClass = LocalCurrentTimeStampType.class, version = true)
java.sql.Timestamp timestamp;

[[الأعمال التالية لتاريخ الإنشاء وليس للتحديثات الأخرى. سأتركه للحصول على معلومات عامة.]]

كان هذا غير تافهة ولكن أنا في النهاية أحسب الطريق يمكنك القيام بذلك باستخدام أحدث نسخة من الجذع. في 4.46 سنقوم بإضافة دعم ل @DatabaseField(readOnly = true) للحقول التي هي للقراءة فقط. هذا يسمح لك أن تقول:

@DatabaseField(defaultValue = "CURRENT_TIMESTAMP()", readOnly = true)
java.sql.Timestamp timestamp;

يتم إنشاء حقول للقراءة فقط أو تحديثها - لم يتم إرجاعها إلا في طلبات البحث. المشكلة هي أن TimeStampType يلقي استثناء عندما يحاول التحقق من CURRENT_TIMESTAMP() . لحل هذه المشكلة تحتاج إلى تعريف مخصص:

public class LocalCurrentTimeStampType extends TimeStampType {
    private static final LocalCurrentTimeStampType singleton =
        new LocalCurrentTimeStampType();
    private String defaultStr;
    public LocalCurrentTimeStampType() {
        super(SqlType.DATE, new Class<?>[] { java.sql.Timestamp.class });
    }
    public static LocalCurrentTimeStampType getSingleton() {
        return singleton;
    }
    @Override
    public boolean isEscapedDefaultValue() {
        if ("CURRENT_TIMESTAMP()".equals(defaultStr)) {
            return false;
        } else {
            return super.isEscapedDefaultValue();
        }
    }
    @Override
    public Object parseDefaultString(FieldType fieldType, String defaultStr) throws SQLException {
        this.defaultStr = defaultStr;
        if ("CURRENT_TIMESTAMP()".equals(defaultStr)) {
            return defaultStr;
        } else {
            return super.parseDefaultString(fieldType, defaultStr);
        }
    }
}

ثم يصبح تعريف الحقل الخاص بك:

@DatabaseField(persisterClass = LocalCurrentTimeStampType.class,
    defaultValue = "CURRENT_TIMESTAMP()", readOnly = true)
java.sql.Timestamp timestamp;

يمكنك الحصول على أحدث نسخة من رمز جيثب: https://github.com/j256/ormlite-core

أواجه مشاكل في إنشاء الطوابع الزمنية مع ميسكل. اتبع الاقتراحات هنا من حيث عدم استخدام إدخال محدد من نوع DataType.TIME_STAMP في تعريف @DatabaseField .

يبدو بلدي @DatabaseField الحالي مثل هذا:

 @DatabaseField(format="yyyy-MM-dd HH:mm:ss", defaultValue="CURRENT_TIMESTAMP")
 private Timestamp updatedAt;

لا يزال الحصول على أخطاء على إنشاء الجدول:

Unable to create table because of [Problems parsing default date
string 'CURRENT_TIMESTAMP' using 'yyyy-MM-dd HH:mm:ss.SSSSSS']

لذلك يبدو أن تجاهل تعريف الشكل، بدون تعريف الشكل، ما زلت أحصل على هذا الخطأ:

Unable to create table because of [Problems parsing default date
string 'CURRENT_TIMESTAMP' using 'yyyy-MM-dd HH:mm:ss.SSSSSS']

لقد حاولت تحديد نوع البيانات، وتغييره إلى DATE_TIME ، وما إلى ذلك. لم أجد مجموعة بعد (بخلاف استخدام الطابع الزمني على الإطلاق، وبعد ذلك أنشئ DATE_TIME ، ولكن لا يعمل مع CURRENT_TIMESTAMP ).

أنا عالقة حقا، لأنني قمت بتحديث يدويا الجداول في الماضي، ولكن الآن عدد ينمو وأنا أود أن يكون العمليات الآلي بشكل كامل باستخدام خيارات إنشاء الجدول في أورليت، دون الحاجة إلى الفوضى يدويا مع المخطط لاحقا.

أي مؤشرات سيكون موضع ترحيب كبير حول كيفية الحصول على هذا العمل.





ormlite