generatedId = true 的 getDao 异常
getDao exception with generatedId = true
我想在不为新记录提供 ID 的情况下将记录插入到我的 sqlite 数据库中。所有 ID 都应自动生成。
因此,id 列定义为:
//primary key
@DatabaseField(id = true, columnName = C_ID,generatedId = true)
private int cID;
但是获取dao时抛出异常:
Java.lang.IllegalArgumentException: Must specify one of id,
generatedId, and generatedIdSequence with cID
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2356)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2418)
at android.app.ActivityThread.access0(ActivityThread.java:154)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5293)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
Caused by: java.lang.IllegalArgumentException: Must specify one of id, generatedId, and generatedIdSequence with cID
at com.j256.ormlite.field.FieldType.(FieldType.java:201)
at com.j256.ormlite.table.DatabaseTableConfig.convertFieldConfigs(DatabaseTableConfig.java:236)
at com.j256.ormlite.table.DatabaseTableConfig.extractFieldTypes(DatabaseTableConfig.java:101)
at com.j256.ormlite.dao.BaseDaoImpl.initialize(BaseDaoImpl.java:153)
at com.j256.ormlite.dao.BaseDaoImpl.(BaseDaoImpl.java:128)
at com.j256.ormlite.dao.BaseDaoImpl.(BaseDaoImpl.java:119)
at com.j256.ormlite.dao.BaseDaoImpl.(BaseDaoImpl.java:921)
at com.j256.ormlite.dao.BaseDaoImpl.createDao(BaseDaoImpl.java:921)
at com.j256.ormlite.dao.DaoManager.createDao(DaoManager.java:72)
at com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper.getDao(OrmLiteSqliteOpenHelper.java:279)
我不太明白如何解决这个问题?此处抛出异常:
public Dao<Countries, Integer> getCountryDao()
{
if (null == countryDao)
{
try
{
countryDao = getDao(Countries.class); <---Exception
}
catch (java.sql.SQLException e)
{
e.printStackTrace();
}
}
return countryDao;
}
}
这个有效:
//primary key
@DatabaseField(id = true, canBeNull = false, columnName = C_ID)
private int cID;
Bu 我在插入新记录时需要提供ID。怎么了?
嗯,我通常在与你类似的情况下使用:
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = COUNTRY_SEQUENCE_DEF)
@SequenceGenerator(name=COUNTRY_SEQUENCE_DEF, sequenceName = COUNTRY_SEQUENCE_DB , allocationSize = 1)
@Column(name = "ID", unique = true)
private Long cID;
这些注释应该可以解决您的问题。
尝试使用这个
@DatabaseField(columnName = C_ID,generatedId = true)
private int cID;
id
和 generatedId
不能一起使用。使用
@DatabaseField(generatedId = true, allowGeneratedIdInsert = true)
使用您的专栏名称。
以上答案全部正确。
但是我只想指出错误描述的措辞很差。
它说
Must specify one of id, generatedId, and generatedIdSequence with cID
这意味着您只能使用一个 ONE。都是独家选项。
所以你要么使用id要么使用generatedId 或 使用 generatedIdSequence
(我做出了与您相同的假设,并认为我想要一个也是 generatedId 的 id 列)
我想在不为新记录提供 ID 的情况下将记录插入到我的 sqlite 数据库中。所有 ID 都应自动生成。
因此,id 列定义为:
//primary key
@DatabaseField(id = true, columnName = C_ID,generatedId = true)
private int cID;
但是获取dao时抛出异常:
Java.lang.IllegalArgumentException: Must specify one of id, generatedId, and generatedIdSequence with cID at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2356) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2418) at android.app.ActivityThread.access0(ActivityThread.java:154) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5293) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699) Caused by: java.lang.IllegalArgumentException: Must specify one of id, generatedId, and generatedIdSequence with cID at com.j256.ormlite.field.FieldType.(FieldType.java:201) at com.j256.ormlite.table.DatabaseTableConfig.convertFieldConfigs(DatabaseTableConfig.java:236) at com.j256.ormlite.table.DatabaseTableConfig.extractFieldTypes(DatabaseTableConfig.java:101) at com.j256.ormlite.dao.BaseDaoImpl.initialize(BaseDaoImpl.java:153) at com.j256.ormlite.dao.BaseDaoImpl.(BaseDaoImpl.java:128) at com.j256.ormlite.dao.BaseDaoImpl.(BaseDaoImpl.java:119) at com.j256.ormlite.dao.BaseDaoImpl.(BaseDaoImpl.java:921) at com.j256.ormlite.dao.BaseDaoImpl.createDao(BaseDaoImpl.java:921) at com.j256.ormlite.dao.DaoManager.createDao(DaoManager.java:72) at com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper.getDao(OrmLiteSqliteOpenHelper.java:279)
我不太明白如何解决这个问题?此处抛出异常:
public Dao<Countries, Integer> getCountryDao()
{
if (null == countryDao)
{
try
{
countryDao = getDao(Countries.class); <---Exception
}
catch (java.sql.SQLException e)
{
e.printStackTrace();
}
}
return countryDao;
}
}
这个有效:
//primary key
@DatabaseField(id = true, canBeNull = false, columnName = C_ID)
private int cID;
Bu 我在插入新记录时需要提供ID。怎么了?
嗯,我通常在与你类似的情况下使用:
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = COUNTRY_SEQUENCE_DEF)
@SequenceGenerator(name=COUNTRY_SEQUENCE_DEF, sequenceName = COUNTRY_SEQUENCE_DB , allocationSize = 1)
@Column(name = "ID", unique = true)
private Long cID;
这些注释应该可以解决您的问题。
尝试使用这个
@DatabaseField(columnName = C_ID,generatedId = true)
private int cID;
id
和 generatedId
不能一起使用。使用
@DatabaseField(generatedId = true, allowGeneratedIdInsert = true)
使用您的专栏名称。
以上答案全部正确。 但是我只想指出错误描述的措辞很差。
它说
Must specify one of id, generatedId, and generatedIdSequence with cID
这意味着您只能使用一个 ONE。都是独家选项。
所以你要么使用id要么使用generatedId 或 使用 generatedIdSequence
(我做出了与您相同的假设,并认为我想要一个也是 generatedId 的 id 列)