我一直在寻找解决问题的方法,但没有成功。
我有一个应用程序,我从不同的服务接收数据库中特定实体的信息,所以我使用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)。
如果有人对我如何解决这个问题有任何想法,我真的很感激,对于长期解释感到抱歉,我只是想明确我的问题。
感谢。
答案 0 :(得分:2)
首先:除非你真的知道自己在做什么,否则我不会篡改生成的代码。修改可能会影响缓存和数据完整性。
如果您使用的是ORM-Framework(如greendao),通常您会遵循此(insert-or)-update方法: