2016-07-30 90 views
3

Here描述瞭如何更新Couchbase Lite中的文檔。CouchBase Lite - 更新文檔 - Android,爲什麼需要「properties.putAll(..)」?

我注意到,如果我在下面的代碼中取消properties.putAll(doc.getProperties());的註釋,那麼更新不會發生,爲什麼

Document doc = database.getDocument(myDocID); 
Map<String, Object> properties = new HashMap<String, Object>(); 
properties.putAll(doc.getProperties()); // IF I UNCOMMENT THIS LINE, THE UPDATE DOES NOT WORK, WHY ? 
properties.put("title", title); 
properties.put("notes", notes); 
try { 
    doc.putProperties(properties); 
} catch (CouchbaseLiteException e) { 
    e.printStackTrace(); 
} 

我的猜測是,這是因爲一些隱藏的屬性,但不知道。

編輯:

下面是另一個例子代碼顯示了這個問題:

static public void storeDoc(Database db, String key, Map<String, Object> p){ 
     // Save the document to the database 
     Document document = db.getDocument(key); 
     Map<String, Object> p1 = new HashMap<>(); 

     Map<String, Object> oldprops=document.getProperties(); 
     if (oldprops!=null) p1.putAll(oldprops); //if I uncomment this line then the update does not work 

     for (Map.Entry<String, Object > e:p.entrySet()) { 
      p1.put(e.getKey(),e.getValue()); 
     } 

     try { 
      document.putProperties(p1); 
     } catch (CouchbaseLiteException e) { 
      e.printStackTrace(); 
     } 
    } 
+0

對不起,第一次使用的是錯誤的代碼。你正在使用哪個版本的CBL?這在1.2.1中適用於我。 – Hod

+0

你是什麼意思的「不工作」?是否有例外?數據根本沒有更新? – borrrden

+0

是的。未更新。 – jhegedus

回答

0

當您檢索文檔,你會得到它包含了數據的不可變版本的副本。您可以通過將地圖複製到單獨的地圖對象中,然後覆蓋舊地圖來處理此問題。

如果您不想使用putAll,您可以使用createRevision()獲取新的UnsavedRevision。這將返回最新版本的副本,但內容可變。然後您可以直接操作屬性圖。通過調用save()來提交更改。

UnsavedRevision update = document.createRevision(); 
profile = update.getProperties(); 
profile.put("type", "profile"); // Add a "type" to the document 

try { 
    update.save(); 
} catch (CouchbaseLiteException ex) { 
    Log.e(TAG, "CBL operation failed"); 
}