【问题标题】:getDao exception with generatedId = true生成Id = true的getDao异常
【发布时间】:2015-07-05 20:38:39
【问题描述】:

我想在我的 sqlite 数据库中插入记录而不为新记录提供 ID。所有的 id 都应该是自动生成的。

所以,id列定义为:

//primary key
@DatabaseField(id = true, columnName = C_ID,generatedId = true)
private int cID;

但是获取dao时抛出异常:

Java.lang.IllegalArgumentException: 必须指定 id 之一, generatedId 和 generateIdSequence 与 cID 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2356) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2418) 在 android.app.ActivityThread.access$900(ActivityThread.java:154) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5293) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699) 原因:java.lang.IllegalArgumentException:必须用 cID 指定 id、generatedId 和 generatedIdSequence 之一 在 com.j256.ormlite.field.FieldType.(FieldType.java:201) 在 com.j256.ormlite.table.DatabaseTableConfig.convertFieldConfigs(DatabaseTableConfig.java:236) 在 com.j256.ormlite.table.DatabaseTableConfig.extractFieldTypes(DatabaseTableConfig.java:101) 在 com.j256.ormlite.dao.BaseDaoImpl.initialize(BaseDaoImpl.java:153) 在 com.j256.ormlite.dao.BaseDaoImpl.(BaseDaoImpl.java:128) 在 com.j256.ormlite.dao.BaseDaoImpl.(BaseDaoImpl.java:119) 在 com.j256.ormlite.dao.BaseDaoImpl $5.(BaseDaoImpl.java:921) 在 com.j256.ormlite.dao.BaseDaoImpl.createDao(BaseDaoImpl.java:921) 在 com.j256.ormlite.dao.DaoManager.createDao(DaoManager.java:72) 在 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;

但我需要在插入新记录时提供 ID。怎么了?

【问题讨论】:

    标签: java android auto-increment ormlite


    【解决方案1】:

    idgeneratedId 不能一起使用。使用

    @DatabaseField(generatedId = true, allowGeneratedIdInsert = true)
    

    使用您的列名。

    【讨论】:

      【解决方案2】:

      尝试使用这个

       @DatabaseField(columnName = C_ID,generatedId = true)
       private int cID;
      

      【讨论】:

      • 不是我的答案,但我发现了我的问题。非常重要的一点:不能将字段“int id”与“@DatabaseField(id = true)”一起使用。必须这样写:"@DatabaseField(columnName = "myID" , id = true)"。
      • 你能解释一下为什么会这样吗?
      【解决方案3】:

      嗯,通常情况与我使用的情况类似:

        @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;
      

      这些注释应该可以解决您的问题。

      【讨论】:

        【解决方案4】:

        以上所有答案都是正确的。 但是我只是想指出错误描述的措辞很糟糕。

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

        所以你要么使用id 使用generatedId 使用生成的IdSequence

        (我和你做了同样的假设,并认为我想要一个 id 列,它也是一个 generateId)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-26
          • 2014-02-22
          • 2013-04-08
          • 1970-01-01
          • 2018-12-11
          • 2019-03-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多