如何以JSON格式在couchbase lite android中插入数据

时间:2015-12-15 05:36:33

标签: java android json couchbase couchbase-lite

我是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"
        },
}

4 个答案:

答案 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/