2013-10-02 85 views
0

我使用mapDB來存儲我的數據,這些數據插入到地圖中。我遵循mapDB-Site上的說明,並能夠設置數據庫並填寫值。但是我的問題就在這裏,我將數據插入到地圖中,然後調用數據庫類將地圖插入到數據庫中。當前地圖,然後添加到數據庫,而是自動覆蓋以前的條目,使條目的數量總是1Java:使用mapDB,寫入數據庫覆蓋以前的條目

這裏是我的代碼:

for(Element objects : objectInstanceList) 
        { 

        mapID = objects.getName().toString(); 
        List<Element> listObjects1 = objects.getChildren(); 
        Multimap<String, Values> mm = HashMultimap.create(); 

        for(Element objectClasses : listObjects1) 
         {  
          List<Element> listObjects2 = objectClasses.getChildren(); 

          for(Element objectAttributes : listObjects2) 
           { 
            String name = objectAttributes.getAttributeValue("name"); 
            String type = objectAttributes.getAttributeValue("type"); 
            String value = objectAttributes.getAttributeValue("value"); 
            Values v = new Values(name, type, value); 
            mm.put(objectClasses.getName(), v);      
           } 

         }       
         DataBase.putHW(mapID, mm); 
         System.out.println(mm); 

        } 

就像我說我填的是Multimap之mm,並且有一些值和Method Database.putHW,它看起來像這樣(在mapDB頁面的例子中創建)。

public class DataBase { 

static DB dbHW = DBMaker.newMemoryDB().make(); 
static NavigableSet<Fun.Tuple2<String, Multimap<String,Values>>> multimapHW 
= dbHW.getTreeSet("Applications"); 

public static void putHW(String mapID, Multimap<String,Values> dbMap) { 

multimapHW = dbHW.createTreeSet("Delta").serializer(BTreeKeySerializer.TUPLE2).make(); 
multimapHW.add(Fun.t2(mapID, dbMap)); // Fun means functional, its the Function to add values in the map  
    } 
} 

那麼爲什麼數據庫中的multimapHW只包含1個條目而不是多個條目呢?

回答

4

MapDB要求鍵和值是不可變的。這使得使用集合作爲鍵/值非常成問題。

在有序集合中使用Multimap<String,Values>是完全錯誤的,因爲MapDB將它傳遞給可能失敗的比較器。

對於您的使用情況,我會建議TreeSet的和分裂多重映射到三元組:

static NavigableSet<Fun.Tuple3<String, String,Values>> multimapHW =  
     dbHW.createTreeSet("Applications") 
      .serializer(BTreeKeySerializer.TUPLE3) 
      .makeOrGet(); 

它採用TUPLE3串行確保有效的空間利用。 Bind類具有靜態方法,允許在給定主鍵的第二和第三級找到鍵。一些示例如下:

https://github.com/jankotek/MapDB/blob/master/src/test/java/examples/MultiMap.java

+0

感謝您的回答。數據類型值包含3個字符串。它代表了Object的某個屬性。問題是,它不符合java.lang.comparable,因此我不能將它添加到Tuple中。 Multimap for Values的數據結構對我來說看起來不錯,我只需要一個數據庫來保存它們。猜測我的數據結構有1個鍵(對象的名稱)和一個包含所有屬性的Map不適合mapDB。我對這個假設是否正確? – Alika87