[英]Java: Using mapDB, writing in Database overwrites previous entry
我使用mapDB來存儲我的數據,這些數據已插入地圖中。 我按照mapDB-Site上的說明進行操作,能夠建立數據庫並用值填充它。 但是我的問題就在這里,我將數據插入到地圖中,然后調用數據庫類將地圖插入到數據庫中。 然后將當前映射添加到數據庫,但會自動覆蓋前一個條目,因此條目數始終為1。
這是我的代碼:
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);
}
就像我說的,我用一些值和方法Database.putHW填充了Multimap mm,它看起來像這樣(在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個條目,而不是許多條目?
MapDB要求鍵和值是不可變的。 這使得將集合用作鍵/值非常麻煩。
在Mapted集中使用Multimap<String,Values>
是完全錯誤的,因為MapDB將其傳遞給比較器可能會失敗。
為了您的使用,我建議使用TreeSet並將multimap拆分為三元組:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.