我是NoSQL数据库的新手。我想将以下JSON数据保存到CouchBase Lite中。有人可以指导我做最好的方法吗?
{"widget": {
"window": {
"title": "Sample Konfabulator Widget",
"name": "main_window",
"width": 500,
"height": 500
},
"image": {
"src": "Images/Sun.png",
"name": "sun1",
"hOffset": 250,
"vOffset": 250,
"alignment": "center"
},
"text": {
"data": "Click Here",
"size": 36,
"style": "bold",
"name": "text1",
"hOffset": 250,
"vOffset": 100,
"alignment": "center",
"onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
}
}}
我尝试使用以下代码执行此操作。
public void insertSample(String widget,String control,ArrayList<eModel> details){
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("control", control);
properties.put("details", details);
Document document = database.getDocument(widget);
try {
document.putProperties(properties);
} catch (CouchbaseLiteException e) {
Log.e("", "Cannot save document", e);
}
}
但是这段代码每次都会创建一个新的id。我想多次插入相同的小部件值。
这是运行时数据,而不是我想逐个插入的静态数据。
例如,给定一个小部件Map如下:
{"widget": {
"window": {
"title": "Sample Konfabulator Widget",
"name": "main_window",
"width": 500,
"height": 500
},
}
然后我想在&#34;窗口下附加以下字段&#34;字段:
"image": {
"src": "Images/Sun.png",
"name": "sun1",
"hOffset": 250,
"vOffset": 250,
"alignment": "center"
},
}
答案 0 :(得分:1)
Couchbase Lite中对文档的约束是_id
属性应该是唯一的。随着文档的更新,它会创建新的修订版。
更新文档有两种可能的方法:
putProperties
:给定一个新的JSON对象,它用该对象替换文档的正文。update
:采用回调函数或块。它加载当前版本的属性,然后调用此函数,向其传递一个UnsavedRevision
对象,其属性是当前版本的可变副本。您的回调代码可以根据需要修改此对象的属性;返回后,修改后的修订版本将保存并成为当前版本。因此,要使用image
字典更新窗口小部件文档,您应该使用更新方法:
final Map<String, Object> imageProperties = new HashMap<String, Object>();
imageProperties.put("src", "Images/Sun.png");
imageProperties.put("name", "sun1");
// ...
Document document = database.getDocument(widgetId);
document.update(new Document.DocumentUpdater() {
@Override
public boolean update(UnsavedRevision newRevision) {
Map<String, Object> properties = newRevision.getUserProperties();
properties.put("image", imageProperties);
newRevision.setUserProperties(properties);
return true;
}
});
注意:建议使用像Jackson这样的库来序列化/反序列化Java应用程序中的JSON和POJO模型(您可以阅读此blog post以查找更多信息)。
答案 1 :(得分:0)
您需要像这样构建地图以保存上面的json格式。
Map<String, Object> windowMap = new HashMap<String, Object>();
windowMap.put("title","Sample Konfabulator Widget");
windowMap.put("name","main_window");
windowMap.put("width",500);
windowMap.put("height",500);
Map<String, Object> imageMap = new HashMap<String, Object>();
imageMap.put("src","Images/Sun.png");
imageMap.put("name","sun1");
imageMap.put("hOffset",250);
imageMap.put("vOffset",250);
Map<String, Object> textMap = new HashMap<String, Object>();
textMap.put("data","Click Here");
textMap.put("size",36);
Map<String, Object> memberMap = new HashMap<String, Object>();
memberMap.put("window",windowMap);
memberMap.put("image",imageMap);
memberMap.put("text",textMap);
Map<String, Object> widgetMap = new HashMap<String, Object>();
widgetMap.put("widget",memberMap);
try {
document.putProperties(widgetMap);
} catch (CouchbaseLiteException e) {
Log.e("", "Cannot save document", e);
}
答案 2 :(得分:0)
我遇到了同样的问题。您需要遍历json的键并使用putproperties添加每个对象。但是,对于JSONArray,您需要使用ArrayList。我正在使用Jackson库遍历密钥(内部也由couchbase使用)
try {
Map<String, Object> properties = new HashMap<String, Object>();
JsonFactory factory = new JsonFactory();
ObjectMapper mapper = new ObjectMapper(factory);
// convert you json string to Jackson JsonNode
JsonNode rootNode = mapper.readTree(doc.toString());
Iterator<Map.Entry<String, JsonNode>> it = rootNode.getFields();
while (it.hasNext()) {
Map.Entry<String, JsonNode> pair = it.next();
String key = pair.getKey().toString();
String value = pair.getValue().toString();
if (JSONDiffUtil.isJSONArray(value)) {
Debug.logInfo("its a json array: " + key, MODULE);
ArrayNode arrNode = (ArrayNode) pair.getValue();
properties.put(key, arrNode);
}
else if (key.startsWith("_")) {
Debug.logInfo("skipping _rev" + key, MODULE);
}
else {
Debug.logInfo("its a json object: " + key, MODULE);
properties.put(key, pair.getValue());
}
}
document.putProperties(properties);
}
catch (CouchbaseLiteException e) {
Debug.logInfo("Error", MODULE);
Debug.logInfo(e.getMessage(), MODULE);
} catch (JsonProcessingException e) {
Debug.logInfo(e.getMessage(), MODULE);
} catch (IOException e) {
Debug.logInfo(e.getMessage(), MODULE);
}
答案 3 :(得分:0)
有一个非常有用的链接,您可以在其中找到良好的信息 https://blog.couchbase.com/object-mapping-couchbase-mobile-android/