4

这是我失败的代码(它在一个活动中运行,数据库助手在数据库中创建了 WishList 对象)

DatabaseHelper helper = DatabaseHelper.getInstance( getActivity() );
int savedID = 0;
WishList wl = new WishList();
wl.setName("abc");
try {
    savedID = helper.getWishListDao().create(wl);
    WishList wl_saved = helper.getWishListDao().queryForId( savedID );
    wl_saved.getId();
} catch (SQLException e) {
    e.printStackTrace();
}

这是我的实体。ID 字段是自动生成的。

@DatabaseTable
public class WishList {
    @DatabaseField(generatedId = true)
    private int id;

    @DatabaseField( canBeNull = false , unique = true )
    private String name;

    @ForeignCollectionField
    private ForeignCollection<WishItem> items;
    ...

问题是在数据库中生成的 ID 与 ORMlite 在下面的调用中返回的 ID 不同。它返回 1。

 savedID = helper.getWishListDao().create(wl);

数据库中的 ID 实际上是 37。任何想法我可能做错了什么?使用版本 4.41

4

1 回答 1

22

ORMLite 的 Dao.create(...)方法不返回新创建对象的 ID,而是返回数据库中更改的行数——通常为 1。这里是Dao.create(...).

从一个对象在数据库中创建一个新行。如果正在创建的对象使用 DatabaseField.generatedId() 则数据参数将被修改并使用数据库中的相应 id 进行设置。... 返回:数据库中更新的行数。这应该是 1。

当 ORMLite 创建对象时,生成的 ID 随后会设置为该id字段。要查找新对象的 ID,您可以从对象本身获取它:

// create returns 1 row changed
helper.getWishListDao().create(wl);
// the id field is set on the w1 object after it was created
savedID = w1.getId();
于 2012-07-05T14:13:42.633 回答