[英]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.