使用 Jackcess 从 Access table 中删除特定行
Delete specific rows from an Access table using Jackcess
我正在将 Jackcess API 与 Access 数据库一起使用。我打开数据库并获得特定的 table。如何从此 table 中获取与 ID 列表匹配的数据(行)?
例如,从 table 中获取所有行,其中 id 在列表中。
private List<Component> disabledComponentsIds;
private Database db = null;
db = Database.open(new File(target), false, false);
Table table = db.getTable("t_object");
Table packages = db.getTable("t_package");
for(Map<String, Object> r : table){
if(disabledComponentsIds.contains(r.get("ea_guid"))){
r.get("package_id");
//Delete row from t_package table where id = r.get("package_id")
}
}
在这种特殊情况下,我想删除行。
Jackcess 提供的数据查询功能非常有限,因此您最好的选择是使用迭代器(或流)遍历 table。
for(Row r : myTable)
; // perform any filtering based on rows here
给定一个名为 "t_object" 的 table ...
object_id object_name
--------- -----------
1 alpha
2 bravo
3 charlie
4 delta
5 echo
... 其中 "object_id" 是主键,您可以像这样删除特定行:
// test data
ArrayList<Integer> enabledComponentsIds = new ArrayList<>();
enabledComponentsIds.add(2);
enabledComponentsIds.add(3);
String dbFileSpec = "C:/Users/Public/jackcessTest.mdb";
try (Database db = DatabaseBuilder.open(new File(dbFileSpec))) {
Table t = db.getTable("t_object");
for (int id : enabledComponentsIds) {
Row r = CursorBuilder.findRowByPrimaryKey(t, id);
if (r != null) {
t.deleteRow(r);
}
}
} catch (Exception e) {
e.printStackTrace(System.err);
}
这将删除 "object_id" 为 2 或 3 的行。
编辑:
如果该列未被索引,那么您将不得不遍历每一行(如 Kayaman 所建议的那样)并查看其列值是否包含在列表中:
// test data
ArrayList<Integer> enabledComponentsIds = new ArrayList<>();
enabledComponentsIds.add(2);
enabledComponentsIds.add(3);
String dbFileSpec = "C:/Users/Public/jackcessTest.mdb";
try (Database db = DatabaseBuilder.open(new File(dbFileSpec))) {
Table t = db.getTable("t_object");
for (Row r : t) {
if (enabledComponentsIds.contains(r.getInt("object_id"))) {
t.deleteRow(r);
}
}
} catch (Exception e) {
e.printStackTrace(System.err);
}
我正在将 Jackcess API 与 Access 数据库一起使用。我打开数据库并获得特定的 table。如何从此 table 中获取与 ID 列表匹配的数据(行)?
例如,从 table 中获取所有行,其中 id 在列表中。
private List<Component> disabledComponentsIds;
private Database db = null;
db = Database.open(new File(target), false, false);
Table table = db.getTable("t_object");
Table packages = db.getTable("t_package");
for(Map<String, Object> r : table){
if(disabledComponentsIds.contains(r.get("ea_guid"))){
r.get("package_id");
//Delete row from t_package table where id = r.get("package_id")
}
}
在这种特殊情况下,我想删除行。
Jackcess 提供的数据查询功能非常有限,因此您最好的选择是使用迭代器(或流)遍历 table。
for(Row r : myTable)
; // perform any filtering based on rows here
给定一个名为 "t_object" 的 table ...
object_id object_name
--------- -----------
1 alpha
2 bravo
3 charlie
4 delta
5 echo
... 其中 "object_id" 是主键,您可以像这样删除特定行:
// test data
ArrayList<Integer> enabledComponentsIds = new ArrayList<>();
enabledComponentsIds.add(2);
enabledComponentsIds.add(3);
String dbFileSpec = "C:/Users/Public/jackcessTest.mdb";
try (Database db = DatabaseBuilder.open(new File(dbFileSpec))) {
Table t = db.getTable("t_object");
for (int id : enabledComponentsIds) {
Row r = CursorBuilder.findRowByPrimaryKey(t, id);
if (r != null) {
t.deleteRow(r);
}
}
} catch (Exception e) {
e.printStackTrace(System.err);
}
这将删除 "object_id" 为 2 或 3 的行。
编辑:
如果该列未被索引,那么您将不得不遍历每一行(如 Kayaman 所建议的那样)并查看其列值是否包含在列表中:
// test data
ArrayList<Integer> enabledComponentsIds = new ArrayList<>();
enabledComponentsIds.add(2);
enabledComponentsIds.add(3);
String dbFileSpec = "C:/Users/Public/jackcessTest.mdb";
try (Database db = DatabaseBuilder.open(new File(dbFileSpec))) {
Table t = db.getTable("t_object");
for (Row r : t) {
if (enabledComponentsIds.contains(r.getInt("object_id"))) {
t.deleteRow(r);
}
}
} catch (Exception e) {
e.printStackTrace(System.err);
}