2014-10-10 1311 views
1

我一直在寻找解决方案来解决我的问题而没有成功。android greendao只更新实体中的特定字段

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

到目前为止这么好。

的问题是..让说,例如起见,我的实体被称为用户,与场ID,标题和显示名。

所以在第一个电话,我得到包含只有其ID和标题字段中输入用户JSON对象,所以我将其插入DB和自然DisplayName获取插入为NULL。

随后从其他服务,我得到含有相同的用户(同一ID字段)另一JSON,但它自带的显示名为好,但不包括标题信息都没有。

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

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

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

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

我会很感激,如果有人对我怎么能解决这个任何想法,并为长的解释很抱歉,我只是想在我的问题清楚。

谢谢。

回答

2

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

一般要走这(镶嵌或) - 更新的方法,如果您使用的是ORM框架(如greendao):

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