2011-10-06 1 views
0

내 비즈니스 객체 중 하나에 열거 형 CommunicationMedium 유형의 멤버가 있습니다.안드로이드의 ORMLite는 열거 형 및 기본값 인 열이있는 테이블을 만들 때 예외를 throw합니다.

public enum CommunicationMedium { 
    EMAIL, 
    PHONE, 
    MOBILE, 
    FACSIMILE, 
    HOMEPAGE 
} 

CommunicationData라는 비즈니스 객체에는 다음과 같은 주석이 붙습니다. CommunicationData 클래스의 테이블이 생성받을시기를

@DatabaseTable(tableName="store_communication_data") 
public class CommunicationData{ 

    public static final String STORE_ID ="store_id"; 
    public static final String TABLE_NAME = "store_communication_data"; 
    public static final String MEDIUM_COLUMN_NAME = "medium"; 
    public static final String VALUE_COLUMN_NAME = "value"; 

    @DatabaseFieldSimple(canBeNull=false, columnName=STORE_ID) 
    @DatabaseFieldForeign(foreign=true) 
    private Store store; 

    @DatabaseFieldSimple(canBeNull=false, columnName=MEDIUM_COLUMN_NAME, defaultValue="CommunicationMedium.EMAIL") 
    @DatabaseFieldOther(dataType=DataType.ENUM_STRING) 
    private CommunicationMedium communicationMedium;   

    @DatabaseFieldSimple(canBeNull=false, columnName=VALUE_COLUMN_NAME) 
    private String value; 
    ... 
} 

데이터베이스 도우미에게 예외 다음 처음으로 접근

가 발생합니다. medium 열의 기본값에 문제가있는 것 같습니다.

java.sql.SQLException: SQL statement failed: CREATE TABLE `store_communication_data` (`medium` __ormlite__ no default value string was specified , `store_id` INTEGER NOT NULL , `value` VARCHAR NOT NULL) 
    at com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22) 
    at com.j256.ormlite.table.TableUtils.doStatements(TableUtils.java:458) 
    at com.j256.ormlite.table.TableUtils.doCreateTable(TableUtils.java:436) 
    at com.j256.ormlite.table.TableUtils.createTable(TableUtils.java:223) 
    at com.j256.ormlite.table.TableUtils.createTable(TableUtils.java:53) 
    ... 
Caused by: java.sql.SQLException: Problems executing Android statement: CREATE TABLE `store_communication_data` (`medium` __ormlite__ no default value string was specified , `store_id` INTEGER NOT NULL , `value` VARCHAR NOT NULL) 
    at com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22) 
    at com.j256.ormlite.android.AndroidCompiledStatement.runUpdate(AndroidCompiledStatement.java:71) 
    at com.j256.ormlite.table.TableUtils.doStatements(TableUtils.java:452) 
    ... 
Caused by: android.database.sqlite.SQLiteException: near "string": syntax error: , while compiling: CREATE TABLE `store_communication_data` (`medium` __ormlite__ no default value string was specified , `store_id` INTEGER NOT NULL , `value` VARCHAR NOT NULL) 
    at android.database.sqlite.SQLiteProgram.native_compile(Native Method) 
    at android.database.sqlite.SQLiteProgram.compile(SQLiteProgram.java:110) 
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59) 
    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:41) 
    at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1026) 
    ... 

답변

2

딱지. 이 버그는 버전 4.26의 columnDefinition 기능과 함께 도입되었으며 4.27에서 수정 된 버그입니다. columnDefinition을 지정하지 않고 @DatabaseFieldOther 주석을 사용하면이 불행한 버그가 발생합니다. 당신은 columnDefinition 값을 추가하여 지금 @Flo 그것을 해결할 수 있습니다

@DatabaseFieldSimple(canBeNull = false, columnName = MEDIUM_COLUMN_NAME, defaultValue = "EMAIL") 
@DatabaseFieldOther(dataType = DataType.ENUM_STRING, columnDefinition = "VARCHAR(100) DEFAULT 'EMAIL' NOT NULL") 
private CommunicationMedium communicationMedium; 

bug은 우리의 버그 추적 시스템에 첨가하고 나는 버전 4.27에 고정했습니다. 죄송합니다.

+0

빠른 답변 감사드립니다. 나는 주변에서 일하는 것이 지금 나에게 좋다고 생각한다. – Flo