2012-04-23 90 views
11

在我的Android项目中,ORMLite充当缓存。我正在从Web服务器下载数据并将其放入数据库中。我在我的对象上调用了createOrUpdate,但重复出现在数据库中。除了主键(这只是一个自动递增的整数)之外,数据库条目是相同的。我认为,由于我的第二个对象还没有主键,ORMLite认为这两个对象是不同的,即使其他字段都是相同的。createOrUpdate()总是在ORMLite中创建数据库中的新条目

有谁知道这是真的吗?

回答

16

你不应该叫createOrUpdate,除非你的对象已经有一个id字段设置。 ORMLite确定它是否存在于数据库中的方式是对其执行一个按查询ID。代码如下:

ID id = extractId(data); 
// assume we need to create it if there is no id <<<<<<<<<<<<<<<<<<<<<<< 
if (id == null || !idExists(id)) { 
    int numRows = create(data); 
    return new CreateOrUpdateStatus(true, false, numRows); 
} else { 
    int numRows = update(data); 
    return new CreateOrUpdateStatus(false, true, numRows); 
} 

我将扩展javadoc来更好地解释这个问题。他们是非常弱那里。抱歉。我已将它们更新为:

这是在数据库中创建项目的便利方法,如果它不存在。该id是从data参数中提取的,并且在数据库上创建了一个按ID查询。如果数据库中具有相同标识的行存在,则数据库中的所有列将从数据参数中的字段更新。如果id为null(或0或其他缺省值)或者不存在于数据库中,则该对象将在数据库中创建。这也意味着您的数据项必须有一个已定义的ID字段。

+0

太棒了!我开始怀疑这是行为。谢谢你的光芒。 – Quentamia 2012-04-23 21:45:13

+0

实际上,我需要OP对+1进行的操作,以减少获取新插入所需的默认值:)! – AgentKnopf 2012-04-27 15:08:14

+2

带有'generatedId = true'数据库字段注释的列怎么样?此外,它总是在数据库中创建一个新条目。参见['Bug#173'](http://sourceforge.net/p/ormlite/bugs/173/)。 – user2784435 2014-04-30 10:45:04

0

好像你需要手动提取已经存在的项目的ID,然后update数据库,根据你的实际唯一标识符。具有唯一网址的示例:

CacheItem newEntry = fetchEntry("..."); // fetch it here 
List<CacheItem> existing = mDao.queryForEq("url", newEntry.getUrl()); 
if (existing.size() > 0) { 
    int id = existing.get(0).getId(); 
    newEntry.setId(id); 
    mDao.update(newEntry); 
} else mDao.create(newEntry); 
0

设置您的主键以使其正常工作。

@DatabaseField(columnName =“id”,uniqueIndex = true) private int id;

为我工作。例外情况引发的背景,但它的作品:D