【问题标题】:How to tell ORMLite not to override values in DB with null如何告诉 ORMLite 不要用 null 覆盖 DB 中的值
【发布时间】:2014-04-18 12:58:01
【问题描述】:

我正在使用 ORMLite for Android 将数据存储在 SQLite 数据库中。

在某些情况下,我从 WebService 收到不完整的信息,因此我的一些对象值为 null。然后 ORMLite 尝试将新对象(带有空值)存储到 SQLite 数据库中。

我想要实现的是,如果本地数据库已经有值,ORMLite 将跳过存储具有空值的属性。

例如:我有一个本地 Person 对象,其中包含名字和姓氏。当我从 WebService 接收到仅包含 First Name(这意味着 Last Name == null)的新数据并调用 personDAO.udpate(receivedPersonObject) 时,数据库中的 Last Name 将被 null 覆盖。

在使用update() 方法时,有没有办法阻止ORMLite 将空值写入数据库?

【问题讨论】:

    标签: android sqlite ormlite


    【解决方案1】:

    在使用 update() 方法时,有没有办法阻止 ORMLite 将空值写入数据库?

    没有。您可以使用canBeNull = false 标记该字段,但如果它尝试使用null 进行更新,则只会引发异常。我认为您将不得不检查值以查看是否有空值或使用UpdateBuilder 并仅更新您需要更新的特定字段。

    UpdateBuilder<Foo,Integer> updateBuilder = new UpdateBuilder<Foo,Integer>();
    updateBuilder.where().eq(Foo.ID_FIELD, foo.getId());
    if (foo.getFirstName() != null) {
       updateBuilder.where().eq(Foo.FIRST_NAME_FIELD, foo.getFirstName());
    }
    if (foo.getLastName() != null) {
       updateBuilder.where().eq(Foo.LAST_NAME_FIELD, foo.getLastName());
    }
    ...
    updateBuilder.update();
    

    【讨论】:

      【解决方案2】:

      另一种方法是:

      1. 从具有特定 ID 的数据库中获取现有对象。
      2. 将从数据库中检索到的对象的属性更新为传入的属性,检查空值和其他业务规则。
      3. 将更新的对象保存回数据库。

      希望这会有所帮助。

      【讨论】:

        【解决方案3】:

        您应该在调用update() 方法之前自己检查空值

        【讨论】:

        • 我已经知道对象的某些属性为空。那怎么继续呢?
        • 所以你还想更新存储在数据库中的对象的非空值?然后可以从数据库中查询该对象,将WebService接收到的对象中的空值替换为数据库中对象的空值,然后调用update()方法。我现在想不出别的了
        猜你喜欢
        • 2012-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-27
        • 2017-12-06
        相关资源
        最近更新 更多