android greendao更新实体中的特定字段

时间:2014-10-10 21:30:53

标签: android entities greendao greendao-generator

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

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

到目前为止一切顺利。

问题是..比如说,我的实体叫做User,有字段id,title和displayName。

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

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

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

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

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

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

如果有人对我如何解决这个问题有任何想法,我真的很感激,对于长期解释感到抱歉,我只是想明确我的问题。

感谢。

1 个答案:

答案 0 :(得分:2)

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

如果您使用的是ORM-Framework(如greendao),通常您会遵循此(insert-or)-update方法:

  1. 尝试从db中获取要修改的实体(可能已经在缓存中,因此这可能不是真正的数据库操作)
  2. 如果您没有这样的实体:创建它
  3. 根据您的需要修改实体
  4. 在数据库中插入或更新它(在greendao中你将使用insertOrReplace)