createOrUpdate()总是创建与ORMLite数据库中的新条目(createOrUpdat

2019-06-23 21:22发布

在我的Android项目,ORMLite被用作高速缓存。 我从Web服务器下载数据,并把它在数据库中。 我打电话createOrUpdate我的对象,但是重复正在出现在数据库中。 该数据库条目除主键相同(这是一个简单的自动递增整数)。 我想,既然我的第二个对象还没有一个主键,ORMLite认为这两个为不同的,即使所有其他领域是相同的。

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

Answer 1:

你不应该叫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从数据提取的参数和查询通过ID是数据库上进行的。 如果然后用相同的ID数据库中的行存在数据库中的所有列将从数据参数字段进行更新。 如果id为空(或0或一些其他默认值),或在数据库中,则对象将在数据库中创建不存在。 这也意味着你的数据项必须有一个id字段定义。



Answer 2:

好像你需要手动提取已经存在的项目的ID,然后update数据库,根据你的实际唯一标识符。 实施例具有独特的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);


Answer 3:

设置主键为它正常工作。

@DatabaseField(COLUMNNAME = “ID”,uniqueIndex =真)私人诠释ID;

为我工作。 例外是在后台抛出,但它的工作原理:d



文章来源: createOrUpdate() always creates a new entry in the database with ORMLite