我一直在寻找解决问题的方法,但没有成功。
我有一个应用程序,在该应用程序中,我从不同的服务接收数据库中特定实体的信息,因此我使用greenDAOsinsertOrReplace方法,因此每当实体已经存在于我的数据库中时,它都会更新而不是重新创建。
到目前为止还不错。
问题是…举个例子,我的实体名为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对象)。
如果有人知道我该如何解决这个问题,我将不胜感激。很抱歉,我只想澄清我的问题。
谢谢。
首先:除非你真的知道自己在做什么,否则我不会篡改生成的代码。修改可能会影响缓存和数据完整性。
一般来说,如果您使用的是ORM框架(如greendao),那么您将遵循这种(插入或)更新方法:
- 尝试从数据库中获取要修改的实体(可能它已经在缓存中,所以这可能不是真正的数据库操作)
- 如果你没有这样的实体:创建它
- 根据您的需要修改实体
- 在数据库中插入或更新它(在绿道中,您将使用insertOrReplace)