14

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

有没有人知道这是不是真的?

4

3 回答 3

17

createOrUpdate除非您的对象已经设置了 id 字段,否则您不应调用。ORMLite确定它是否存在于数据库中的方法是对其进行查询。代码可以:

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);
}

我将扩展 javadocs 以更好地解释这一点。他们在那里非常虚弱。对不起。我已将它们更新为:

如果项目不存在,这是在数据库中创建项目的便捷方法。id 是从 data 参数中提取的,并在数据库上进行查询。如果数据库中存在具有相同 id 的行,则数据库中的所有列都将从 data 参数中的字段更新。如果 id 为 null(或 0 或其他默认值)或数据库中不存在,则将在数据库中创建对象。这也意味着您的数据项必须定义一个 id 字段。

于 2012-04-23T21:07:21.840 回答
0

似乎您需要update根据您的实际唯一标识符手动提取现有条目的 id,然后提取数据库。具有唯一 URL 的示例:

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);
于 2012-11-05T11:16:07.420 回答
0

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

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

为我工作。在后台抛出异常,但它可以工作:D

于 2017-05-15T09:00:41.830 回答