在我的Android项目,ORMLite被用作高速缓存。 我从Web服务器下载数据,并把它在数据库中。 我打电话createOrUpdate
我的对象,但是重复正在出现在数据库中。 该数据库条目除主键相同(这是一个简单的自动递增整数)。 我想,既然我的第二个对象还没有一个主键,ORMLite认为这两个为不同的,即使所有其他领域是相同的。
有没有人知道这是不是真的?
在我的Android项目,ORMLite被用作高速缓存。 我从Web服务器下载数据,并把它在数据库中。 我打电话createOrUpdate
我的对象,但是重复正在出现在数据库中。 该数据库条目除主键相同(这是一个简单的自动递增整数)。 我想,既然我的第二个对象还没有一个主键,ORMLite认为这两个为不同的,即使所有其他领域是相同的。
有没有人知道这是不是真的?
你不应该叫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字段定义。
好像你需要手动提取已经存在的项目的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);
设置主键为它正常工作。
@DatabaseField(COLUMNNAME = “ID”,uniqueIndex =真)私人诠释ID;
为我工作。 例外是在后台抛出,但它的工作原理:d