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;

idgeneratedId 不能一起使用。使用

@DatabaseField(generatedId = true, allowGeneratedIdInsert = true)

使用您的专栏名称。

以上答案全部正确。 但是我只想指出错误描述的措辞很差。

它说 Must specify one of id, generatedId, and generatedIdSequence with cID 这意味着您只能使用一个 ONE。都是独家选项。

所以你要么使用id要么使用generatedId 使用 generatedIdSequence

(我做出了与您相同的假设,并认为我想要一个也是 generatedId 的 id 列)