1

我一直在寻找解决我的问题的方法,但没有成功。

我有一个应用程序,在该应用程序中,我从不同的服务接收数据库中特定实体的信息,因此我使用 greenDAOs insertOrReplace 方法,因此只要实体已经存在于我的数据库中,它就会被更新而不是重新创建。

到目前为止,一切都很好。

问题是......例如,假设我的实体被称为用户,具有字段 id、title 和 displayName。

因此,在第一次调用中,我得到了一个 JSON 对象,其中包含一个只有其 id 和 title 字段的用户,所以我将它插入到数据库中,并且自然地将 displayName 插入为 NULL。

之后从另一个服务我得到另一个包含相同用户(相同 id 字段)的 JSON,但它也带有 displayName,但根本不包括标题信息。

因此,每当我在 greenDAO 自动生成的 DAO 对象上运行 insertOrReplace 时,用户都会更新,但由于标题信息不存在,当它更新时,标题字段会重置为 NULL,所以我最终会丢失数据。

不幸的是,我无法更改从服务返回的数据,也无法解决此问题。我很难相信没有简单的方法可以告诉 DAO 对象只更新某些字段而不是全部。

我正在查看由 greenDAO 生成的代码,在生成的 dao 对象中有一个 bindValues 方法,该方法在执行查询之前被调用,显然它从对象中过滤掉了 NULL 属性,但无论哪种方式,它都会使用 NULL 进行更新价值。

通过从父类添加一些方法来修改最终生成的 dao 对象,我能够提出某种修复方法,但我认为这不是一个好的解决方案,因为我必须对所有 dao 执行此操作对象。(我知道可以定义一个自定义超类,但这仅适用于实体对象,而不适用于 DAO 对象)。

如果有人对我如何解决这个问题有任何想法,我将不胜感激,并且对于冗长的解释感到抱歉,我只是想明确我的问题。

谢谢。

4

1 回答 1

2

首先:除非您真的知道自己在做什么,否则我不会篡改生成的代码。修改可能会影响缓存和数据完整性。

通常,如果您使用的是 ORM 框架(如 greendao),则遵循此(插入或)更新方法:

  1. 尝试从数据库中获取要修改的实体(可能它已经在缓存中,所以这可能不是真正的数据库操作)
  2. 如果您没有这样的实体:创建它
  3. 根据您的需要修改实体
  4. 在数据库中插入或更新它(在greendao中你会使用insertOrReplace)
于 2014-11-14T22:23:54.227 回答