2014-10-10 59 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)