2012-07-05 41 views
4

对象这里是我的代码失败(这是一个活动中运行和DB助手在数据库中创建愿望清单对象罚款)ORMlite也不回我刚才保存

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回报。它返回1.

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

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

回答

22

ORMLite'sDao.create(...)方法做返回新创建的对象的ID,但发生了变化,在数据库中的行数 - 通常1.下面是Dao.create(...)的javadoc。

从对象中创建数据库中的新行。如果正在创建的对象使用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(); 
+0

就是这样,我只是因为第一次我跑我的测试它通过去了错误的轨道上(该ID分配给我对象当然是...... 1)当我们谈论这个时,是否有效的假设是,如果方法根据文档返回1,这可以被视为更新/插入成功的指示?文档确实指定了这个 – MayoMan 2012-07-05 14:28:48

+0

真的,你可以忽略来自'create'的1。这有点历史。如果有SQL问题,'create'会抛出异常。当您谈论批量删除和更新时,更改的行数更重要。 – Gray 2012-07-05 15:03:37

+1

@Gray为CREATE更改的行数在SQL中仍然有用处。有一些SQL语句可以从一个表中选择多行并将它们一次插入另一个表中。创建并不总是返回1.因此它不是历史的。 – 2014-09-02 19:15:30

相关问题