不能使用 sbt modify/remove 来自 ActivityNode 的字段
Can't modify/remove a field from an ActivityNode using sbt
我创建了一个 ActivityNode(一个条目),我可以使用
添加自定义字段
setFields(List<Field> newListField)
功能。
但是
我无法修改这些字段。 (在这种情况下我尝试修改名为 LIBENTITE 的字段的值)
FieldList list = myEntry.getTextFields();
List<Field> updatedList = new ArrayList<Field>();
//I add each old field in the new list, but I modify the field LIBENTITE
for(Field myField : list){
if(myField.getName().equals("LIBENTITE")){
((TextField)myField).setTextSummary("New value");
}
updatedList.add(myField);
}
myEntry.setFields(updatedList);
activityService.updateActivityNode(myEntry);
此代码应将旧的字段列表替换为新的字段列表,但我在 IBM 连接中的 myEntry 的自定义字段 LIBENTITE 中看不到任何变化。
所以我尝试创建一个新的字段列表,不是修改我的字段而是添加一个新字段:
for(Field myField:list){
if(!myField.getName().equals("LIBENTITE")){
updatedList.add(myField);
}
}
Field newTextField = new TextField("New Value");
newTextField .setFieldName("LIBENTITE");
updatedList.add(newTextField );
这段代码只是在 myEntry 中添加新字段。我看到的是其他自定义字段没有改变,我现在有两个名为 LIBENTITE 的自定义字段,一个具有旧值,第二个具有新值,在 myEntry 中。
所以我想也许如果我清除旧的字段列表,然后添加新的字段,它会起作用。
我尝试了这两个功能
myEntry.clearFieldsMap();
和
myEntry.remove("LIBENTITE");
但其中 none 似乎有效,我仍然无法使用 SBT 从 myEntry 中删除自定义字段。
有什么建议吗?
我有两个建议,因为我有(或有)类似的问题:
如果要更新 activity 节点中的现有文本字段,必须调用 node.setField(fld)
来更新节点对象中的字段。
我的工作应用程序的代码片段,我正在其中更新包含(计算的)开始时间的文本字段:
ActivityNode node = activityService.getActivityNode(id);
node.setTitle(formatTitle()); // add/update start and end time in title
boolean startFound = false;
// ...
FieldList textfields =node.getTextFields();
Iterator<Field> iterFields = textfields.iterator();
while (iterFields.hasNext()) {
TextField fld = (TextField) iterFields.next();
if (fld.getName().equals(Constants.FIELDNAME_STARTTIME)) {
fld.setTextSummary(this.getStartTimeString()); // NOTE: .setFieldValue does *not* work
node.setField(fld); // write updated field back. This seems to be the only way updating fields works
startFound=true;
}
}
如果没有该名称的字段,我将创建一个新字段(这就是我使用 startFound
布尔变量的原因)。
我认为 node.setField(fld)
应该可以解决问题。如果没有,可能有办法回避这个问题:
您可以访问在其中解析的基础 DOM 对象。您可以使用它来调整 DOM 对象,该对象最终将被写回 Connections。
我不得不使用它,因为 SBT SDK 中似乎还有另一个讨厌的错误:如果您在文本字段中阅读 没有值 ,并将其写回,将抛出错误。看起来 DOM 对象缺少一些必需的节点,因此您必须自己创建它们以避免错误。
一些代码来演示这一点:
// ....
} else if (null == fld.getTextSummary()) { // a text field without any contents. Which is BAD!
// there is a bug in the SBT API: if we read a field which has no value
// and try to write the node back (even without touching the field) a NullPointerException
// will be thrown. It seems that there is no value node set for the field. We
// can't set a value with fld.setTextSummary(), the error will still be thrown.
// therefore we have to remove the field, and - optionally - we set a defined "empty" value
// to avoid the problem.
// node.remove(fld.getName()); // remove the field -- this does *not* work! At least not for empty fields
// so we have to do it the hard way: we delete the node of the field in the cached dom structure
String fieldName = fld.getName();
DeferredElementNSImpl fldData = (DeferredElementNSImpl) fld.getDataHandler().getData();
fldData.getParentNode().removeChild(fldData); // remove the field from the cached dom structure, therefore delete it
// and create it again, but with a substitute value
Field newEmptyField = new TextField (Constants.FIELD_TEXTFIELD_EMPTY_VALUE); // create a field with a placeholder value
newEmptyField.setFieldName(fieldName);
node.setField(newEmptyField);
}
希望对您有所帮助。
为了让 post 不至于无人问津,我写下了最初问题评论中的答案:
"currently, there is no solution to this issue, the TextFields are read-only map. we have the issue recorded on github.com/OpenNTF/SocialSDK/issues/1657"
我创建了一个 ActivityNode(一个条目),我可以使用
添加自定义字段setFields(List<Field> newListField)
功能。
但是
我无法修改这些字段。 (在这种情况下我尝试修改名为 LIBENTITE 的字段的值)
FieldList list = myEntry.getTextFields();
List<Field> updatedList = new ArrayList<Field>();
//I add each old field in the new list, but I modify the field LIBENTITE
for(Field myField : list){
if(myField.getName().equals("LIBENTITE")){
((TextField)myField).setTextSummary("New value");
}
updatedList.add(myField);
}
myEntry.setFields(updatedList);
activityService.updateActivityNode(myEntry);
此代码应将旧的字段列表替换为新的字段列表,但我在 IBM 连接中的 myEntry 的自定义字段 LIBENTITE 中看不到任何变化。
所以我尝试创建一个新的字段列表,不是修改我的字段而是添加一个新字段:
for(Field myField:list){
if(!myField.getName().equals("LIBENTITE")){
updatedList.add(myField);
}
}
Field newTextField = new TextField("New Value");
newTextField .setFieldName("LIBENTITE");
updatedList.add(newTextField );
这段代码只是在 myEntry 中添加新字段。我看到的是其他自定义字段没有改变,我现在有两个名为 LIBENTITE 的自定义字段,一个具有旧值,第二个具有新值,在 myEntry 中。
所以我想也许如果我清除旧的字段列表,然后添加新的字段,它会起作用。 我尝试了这两个功能
myEntry.clearFieldsMap();
和
myEntry.remove("LIBENTITE");
但其中 none 似乎有效,我仍然无法使用 SBT 从 myEntry 中删除自定义字段。
有什么建议吗?
我有两个建议,因为我有(或有)类似的问题:
如果要更新 activity 节点中的现有文本字段,必须调用 node.setField(fld)
来更新节点对象中的字段。
我的工作应用程序的代码片段,我正在其中更新包含(计算的)开始时间的文本字段:
ActivityNode node = activityService.getActivityNode(id);
node.setTitle(formatTitle()); // add/update start and end time in title
boolean startFound = false;
// ...
FieldList textfields =node.getTextFields();
Iterator<Field> iterFields = textfields.iterator();
while (iterFields.hasNext()) {
TextField fld = (TextField) iterFields.next();
if (fld.getName().equals(Constants.FIELDNAME_STARTTIME)) {
fld.setTextSummary(this.getStartTimeString()); // NOTE: .setFieldValue does *not* work
node.setField(fld); // write updated field back. This seems to be the only way updating fields works
startFound=true;
}
}
如果没有该名称的字段,我将创建一个新字段(这就是我使用 startFound
布尔变量的原因)。
我认为 node.setField(fld)
应该可以解决问题。如果没有,可能有办法回避这个问题:
您可以访问在其中解析的基础 DOM 对象。您可以使用它来调整 DOM 对象,该对象最终将被写回 Connections。 我不得不使用它,因为 SBT SDK 中似乎还有另一个讨厌的错误:如果您在文本字段中阅读 没有值 ,并将其写回,将抛出错误。看起来 DOM 对象缺少一些必需的节点,因此您必须自己创建它们以避免错误。
一些代码来演示这一点:
// ....
} else if (null == fld.getTextSummary()) { // a text field without any contents. Which is BAD!
// there is a bug in the SBT API: if we read a field which has no value
// and try to write the node back (even without touching the field) a NullPointerException
// will be thrown. It seems that there is no value node set for the field. We
// can't set a value with fld.setTextSummary(), the error will still be thrown.
// therefore we have to remove the field, and - optionally - we set a defined "empty" value
// to avoid the problem.
// node.remove(fld.getName()); // remove the field -- this does *not* work! At least not for empty fields
// so we have to do it the hard way: we delete the node of the field in the cached dom structure
String fieldName = fld.getName();
DeferredElementNSImpl fldData = (DeferredElementNSImpl) fld.getDataHandler().getData();
fldData.getParentNode().removeChild(fldData); // remove the field from the cached dom structure, therefore delete it
// and create it again, but with a substitute value
Field newEmptyField = new TextField (Constants.FIELD_TEXTFIELD_EMPTY_VALUE); // create a field with a placeholder value
newEmptyField.setFieldName(fieldName);
node.setField(newEmptyField);
}
希望对您有所帮助。
为了让 post 不至于无人问津,我写下了最初问题评论中的答案:
"currently, there is no solution to this issue, the TextFields are read-only map. we have the issue recorded on github.com/OpenNTF/SocialSDK/issues/1657"