首页 / 浏览问题 / 组件GIS / 问题详情
iObjects.Java如何往表单数据集中添加数据
251EXP 2023年04月03日

矢量数据集可以通过

Geometry geometry = recordset_world.getGeometry();
                        java.util.Map map = new java.util.HashMap();

                        FieldInfos fieldInfos = recordset_world.getFieldInfos();

                        for (int i = 0; i < fieldInfos.getCount(); i++) {
                                FieldInfo fieldInfo = fieldInfos.get(i);
                                if (!fieldInfo.getName().equalsIgnoreCase("SMID"))
                                        map.put(fieldInfo.getName(), recordset_world.getFieldValue(fieldInfo.getName()));
                        }

                        recordset.addNew(geometry, map);
                        geometry.dispose();
                        recordset_world.moveNext();
                }
// 批量操作统一提交
        editor.update();

去追加数据。

但如果是没有geometry的表单数据集的场合,请问能否通过类似的代码,不加入geometry,只将数据添加到recordset中并提交更新?

1个回答

您好,可以的属性表型数据集addNew时Geometry可以传空的为null的Geometry。

希望可以帮助到您。
于丁
1
9,633EXP 2023年04月03日
您好,我这边可以成功添加了,感谢解答。

关于这部分的功能我这边还有一个问题想请教一下。

添加完一条数据后,会自动分配一条smid,

请问有没有什么办法在添加数据的时候,直接设置某一条的数据等于这条数据插入后的smid?

还是说必须等到插入完成后重新获取这条数据的smid,再加入进去?
对于基本接口功能来说,建议是插入后在获取,因为可能你的这个数据集有smid为1234的对象,添加了567对象然后删除掉,再添加对象时smid是8,你从现有的1234是无法获取和看出来的,smid字段同数据库单增关键字一样,是一个偏向底层的自增字段。

因此常规建议add并update后再获取,当然如果您的业务和使用中严格约束各个流程没有删除行目情况,那也可以取现在最后一行的数据smid+1。
了解了,多谢解答
您好,我这边先添加完其他的数据后,想要对这个跟smid同步的字段进行修改,代码如下,

recordset.moveFirst();
            while (!recordset.isEOF()) {
                try {
                    Boolean flg = recordset.edit();
                    System.out.println("edit " + flg);
                    Boolean flg3 = recordset.setFieldValue("matchid", recordset.getFieldValue("SmID").toString());
                    Boolean flg2 = recordset.update();
                    System.out.println("update " + recordset.getFieldValue("SmID").toString()+ "," + flg3 + "," + flg2);
                    recordset.moveNext();
                }catch(Exception e){
                    recordset.moveNext();
                }
            }

返回的flg和flg都是true,但打开数据集后,内部的数据并没有更新,请问这是什么原因导致的
您好,有两个建议,一个是单记录更新属性的话,建议直接用对应数据类型的方法,比如16位整型的字段直接用setin16。

另一个是,看您代码想做的是不是在所有数据add完后,让您 matchid字段的值与smid字段的值相同,

如果是的话,建议您在所有数据新增完后,对矢量数据集本身DatasetVector进行更新列操作,把smid列的值都更新到您matchid列,

DatasetVector.updateField,从更新效率性能速度和业务代码逻辑上,更新列都要更好。
您好,感谢解答。我去研究一下DatasetVector.updateField。

另外,我这边发现,如果我在iDesktop中打开了我的目标数据源,那么即使我这边运行iObjects.Java的代码,为数据集里面添加数据。

接下来在iDesktop中无论是直接打开目标数据集还是先关闭数据源,然后重新打开后再打开数据集,都不会显示追加的数据,请问这是正常情况吗?
看你数据源类型,ubd不支持多并发打开,udbx可以多并发但是ubdx也是基于文件io的,尽量控制编辑业务时单端进行。

一定有多并发程序、线程编辑的话,建议使用数据库型数据源。
...