createOrUpdate()始终使用ORMLite在数据库中创建新条目

时间:2012-04-23 21:05:24

标签: android ormlite

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

有谁知道这是真的吗?

3 个答案:

答案 0 :(得分:16)

除非你的对象已经设置了id字段,否则你不应该调用createOrUpdateORMLite确定数据库中是否存在的方式是对其进行id-query。代码确实:

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,并在数据库上进行id-query。如果存在具有相同id的数据库中的行,则将从data参数中的字段更新数据库中的所有列。如果id为null(或0或某个其他默认值)或数据库中不存在,则将在数据库中创建该对象。这也意味着您的数据项必须定义一个id字段。

答案 1 :(得分: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);

答案 2 :(得分:0)

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

@DatabaseField(columnName =&#34; id&#34;,uniqueIndex = true) private int id;

为我工作。例外情况会在背景中引发,但它有效:D