我有一个分类的Notes视图,比方说第一个分类列是TypeOfVehicle,第二个分类列是Model,第三个分类列是Manufacturer。
我想只收集第一个类别的值,并将其作为json对象返回。
我面临两个问题: - 我无法读取类别的值,列的值是emptry,当我试图访问底层文档时,它是空的。
谁能给我解释一下,我在这里做错了什么?
private Object getFirstCategory() {
JsonJavaObject json = new JsonJavaObject();
try{
String server = null;
String filepath = null;
server = props.getProperty("server");
filepath = props.getProperty("filename");
Database db;
db = utils.getSession().getDatabase(server, filepath);
if (db.isOpen()) {
View vw = db.getView("transport");
if (null != vw) {
vw.setAutoUpdate(false);
ViewNavigator nav;
nav = vw.createViewNav();
JsonJavaArray arr = new JsonJavaArray();
Integer count = 0;
ViewEntry tmpentry;
ViewEntry entry = nav.getFirst();
while (null != entry) {
Vector<?> columnValues = entry.getColumnValues();
if(entry.isCategory()){
System.out.println("entry notesid = " + entry.getNoteID());
Document doc = entry.getDocument();
if(null != doc){
if (doc.hasItem("TypeOfVehicle ")){
System.out.println("category has not " + "TypeOfVehicle ");
}
else{
System.out.println("category IS " + doc.getItemValueString("TypeOfVehicle "));
}
} else{
System.out.println("doc is null");
}
JsonJavaObject row = new JsonJavaObject();
JsonJavaObject jo = new JsonJavaObject();
String TypeOfVehicle = String.valueOf(columnValues.get(0));
if (null != TypeOfVehicle ) {
if (!TypeOfVehicle .equals("")){
jo.put("TypeOfVehicle ", TypeOfVehicle );
} else{
jo.put("TypeOfVehicle ", "Not categorized");
}
} else {
jo.put("TypeOfVehicle ", "Not categorized");
}
row.put("request", jo);
arr.put(count, row);
count++;
tmpentry = nav.getNextSibling(entry);
entry.recycle();
entry = tmpentry;
} else{
//tmpentry = nav.getNextCategory();
//entry.recycle();
//entry = tmpentry;
}
}
json.put("data", arr);
vw.setAutoUpdate(true);
vw.recycle();
}
}
} catch (Exception e) {
OpenLogUtil.logErrorEx(e, JSFUtil.getXSPContext().getUrl().toString(), Level.SEVERE, null);
}
return json;
}
你做错的是试图将任何单一的视图条目同时视为一个类别和一个文档。一个单一的视图条目只能是类别、文档或总数中的一个。
如果你有一个条目 isCategory()
返回 true
,然后对同一条目。
isDocument()
将返回 false
.getDocument()
将返回 null
.getNoteID()
将返回一个空字符串。如果你只需要顶层类别,那么从导航器中获取第一个条目,然后使用 nav.getNextSibling(entry)
因为你已经在做了,但是。
entry.getColumnValues().get(0)
来获取每个类别的第一列的值。如果视图中包含任何未分类的文档,那么有可能是 entry.getColumnValues().get(0)
可能会抛出异常,所以你也应该检查一下 entry.getColumnValues().size()
至少是1,然后再尝试获取一个值。
如果您需要任何额外的数据,而不仅仅是顶层类别,那么请注意子类别和文档是其父类别的子类。如果一个条目有一个子类别。nav.getChild(entry)
将获得该条目的第一个子类别。如果一个条目有 没有 子类,但却是一个包含文档的类别。nav.getChild(entry)
将获得该类别中的第一个文档。