Java Android上的ORMLite在创建包含enum类型列和默认值的表时引发异常

Java Android上的ORMLite在创建包含enum类型列和默认值的表时引发异常,java,android,ormlite,Java,Android,Ormlite,我的一个业务对象获得了类型为CommunicationMedium(枚举)的成员 public enum CommunicationMedium { EMAIL, PHONE, MOBILE, FACSIMILE, HOMEPAGE } 名为CommunicationData的业务对象的注释如下所示 @DatabaseTable(tableName="store_communication_data") public class Communicatio

我的一个业务对象获得了类型为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)
     ...
java.sql.SQLException:sql语句失败:创建表`store\u communication\u data`(`medium`\uuuu或mlite\uuuu未指定默认值字符串,`store\u id`INTEGER NOT NULL,`value`VARCHAR NOT NULL)
位于com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22)
位于com.j256.ormlite.table.TableUtils.doStatements(TableUtils.java:458)
位于com.j256.ormlite.table.TableUtils.doCreateTable(TableUtils.java:436)
在com.j256.ormlite.table.TableUtils.createTable(TableUtils.java:223)上
位于com.j256.ormlite.table.TableUtils.createTable(TableUtils.java:53)
...
原因:java.sql.SQLException:执行Android语句时出现问题:创建表`store\u communication\u data`(`medium`\uuuu或mlite\uuuu未指定默认值字符串,`store\u id`INTEGER NOT NULL,`value`VARCHAR NOT NULL)
位于com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22)
在com.j256.ormlite.android.AndroidCompiledStatement.runUpdate(AndroidCompiledStatement.java:71)
位于com.j256.ormlite.table.TableUtils.doStatements(TableUtils.java:452)
...
原因:android.database.sqlite.SQLiteException:near“string”:语法错误:,编译时:创建表`store\u communication\u data`(`medium`\uuuu或mlite\uuuuu~未指定默认值字符串,`store\u id`INTEGER NOT NULL,`value`VARCHAR NOT NULL)
在android.database.sqlite.SQLiteProgram.native_编译(本机方法)
位于android.database.sqlite.SQLiteProgram.compile(SQLiteProgram.java:110)
位于android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:59)
位于android.database.sqlite.SQLiteStatement.(SQLiteStatement.java:41)
位于android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1026)
...

废话。这是4.26版中的
columnDefinition
功能引入的一个bug,在4.27版中修复。如果使用
@DatabaseFieldOther
注释而未指定
列定义
,则会触发此错误。现在@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中修复了它。
抱歉。

谢谢你的快速回答。我认为目前这项工作对我来说还可以。