ORMLite на Android вызывает исключение при создании таблицы со столбцом типа enum и значением по умолчанию - PullRequest
0 голосов
/ 06 октября 2011

Один из моих бизнес-объектов получил член типа CommunicationMedium, который является перечислением.

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

Бизнес-объект с именем 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; 
    ...
}

При обращении к помощнику базы данных выдается первое исключение в первый раз, когда должна быть создана таблица для класса CommunicationData. Кажется, есть проблема со значением по умолчанию для столбца 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)
     ...

1 Ответ

2 голосов
/ 07 октября 2011

Дерьмо.Это ошибка, которая была введена с функцией columnDefinition в версии 4.26 и была исправлена ​​в 4.27.Если вы используете аннотацию @DatabaseFieldOther без указания columnDefinition, вы вызовете эту досадную ошибку.Вы можете обойти это сейчас @Flo, добавив значение columnDefinition:

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

Ошибка была добавлена ​​в нашу систему отслеживания ошибок, и я исправил ее в версии 4.27,К сожалению.

...