【问题标题】:createOrUpdate() always creates a new entry in the database with ORMLitecreateOrUpdate() 总是使用 ORMLite 在数据库中创建一个新条目
【发布时间】:2012-04-23 21:05:24
【问题描述】:

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

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

【问题讨论】:

    标签: android ormlite


    【解决方案1】:

    您不应该调用createOrUpdate,除非您的对象已经设置了 id 字段。 ORMLite 判断它是否存在于数据库中的方式是对它做一个query-by-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);
    }
    

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

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

    【讨论】:

    • 太棒了!我开始怀疑这是行为。感谢您提供一些启示。
    • 实际上我需要 OP 的行为 +1 来阐明获取新插入所需的默认值:)!
    • 带有generatedId = true 数据库字段注释的列怎么样?然后它总是在数据库中创建一个新条目。见Bug #173
    • 将“”字段作为参数不是很好吗?由于用户可能会使用其他名称作为主键.. 我正面临这个问题:)
    • @Gray 我无法理解这个话题,你能把我链接到更好的示例到如何简单地使用createOrUpdate 吗?
    【解决方案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);
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-18
        • 2019-01-16
        • 1970-01-01
        • 2021-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多