对象化:按 id 删除整行
Objectify: delete entire row by id
我需要检查某个字段是否包含特定的 String
,如果包含 - 按 ID 删除整行。
此代码无效:
Query<Bet> query = ofy().load().type(Movie.class);
for (Movie m : query) {
List<String> list = m.getActors();
String search = "Brad Pitt";
for (String str : list) {
if (str.trim().contains(search)) {
ofy().delete().type(Movie.class).id(m.getId()).now();
}
}
}
在这种情况下(删除所有有布拉德皮特作为演员的电影)你可以像这样删除实体:
Query<Movie> query = ofy().load().type(User.class);
for (Movie m : query) {
List<String> list = m.getActors();
String search = "Brad Pitt";
for (String str : list) {
if (str.trim().contains(search)) {
ofy().delete().entity(m).now();
}
}
}
不是我用 delete().entity(...)
删除的。另一种选择是像 delete().key(Key.create(Movie.class, idToRemove)
这样的按键删除。前者做的事情非常相似,但由于您拥有整个实体,因此不需要使事情复杂化。此外,如果您使用 entity(...)
删除,当实体具有 @Parent
时它会起作用,而如果您按键删除,则必须在 Key.create(ancestorKey, Movie.class, idToRemove)
.
中另外指定祖先
我经常像这样进行多次删除:
Query<Movie> query = ofy().load().type(User.class);
List<Movie> toDelete = new ArrayList<>();
for (Movie m : query) {
List<String> list = m.getActors();
String search = "Brad Pitt";
for (String str : list) {
if (str.trim().contains(search)) {
toDelete.add(m);
}
}
}
ofy().delete().entities(toDelete).now();
在循环中执行数据库操作是不好的风格,应尽可能避免。
还有一点:
如果您必须通过 ID 删除实体,则该行将如下所示:
ofy().delete().type(Movie.class).id(idToDelete);
但是,正如我之前暗示的那样,如果您的 Movie
class 有一个父项,这将不起作用,因为您必须始终指定整个键,因此对于祖先,该行将如下所示:
Key<MyParentClass> parent = Key.create(MyParentClass.class, myParentId);
ofy().delete().type(Movie.class).parent(parent).id(idToDelete);
相当于
ofy().delete().key(Key.create(Key.create(MyParentClass.class, myParentId), Movie.class, idToDelete));
我需要检查某个字段是否包含特定的 String
,如果包含 - 按 ID 删除整行。
此代码无效:
Query<Bet> query = ofy().load().type(Movie.class);
for (Movie m : query) {
List<String> list = m.getActors();
String search = "Brad Pitt";
for (String str : list) {
if (str.trim().contains(search)) {
ofy().delete().type(Movie.class).id(m.getId()).now();
}
}
}
在这种情况下(删除所有有布拉德皮特作为演员的电影)你可以像这样删除实体:
Query<Movie> query = ofy().load().type(User.class);
for (Movie m : query) {
List<String> list = m.getActors();
String search = "Brad Pitt";
for (String str : list) {
if (str.trim().contains(search)) {
ofy().delete().entity(m).now();
}
}
}
不是我用 delete().entity(...)
删除的。另一种选择是像 delete().key(Key.create(Movie.class, idToRemove)
这样的按键删除。前者做的事情非常相似,但由于您拥有整个实体,因此不需要使事情复杂化。此外,如果您使用 entity(...)
删除,当实体具有 @Parent
时它会起作用,而如果您按键删除,则必须在 Key.create(ancestorKey, Movie.class, idToRemove)
.
我经常像这样进行多次删除:
Query<Movie> query = ofy().load().type(User.class);
List<Movie> toDelete = new ArrayList<>();
for (Movie m : query) {
List<String> list = m.getActors();
String search = "Brad Pitt";
for (String str : list) {
if (str.trim().contains(search)) {
toDelete.add(m);
}
}
}
ofy().delete().entities(toDelete).now();
在循环中执行数据库操作是不好的风格,应尽可能避免。
还有一点:
如果您必须通过 ID 删除实体,则该行将如下所示:
ofy().delete().type(Movie.class).id(idToDelete);
但是,正如我之前暗示的那样,如果您的 Movie
class 有一个父项,这将不起作用,因为您必须始终指定整个键,因此对于祖先,该行将如下所示:
Key<MyParentClass> parent = Key.create(MyParentClass.class, myParentId);
ofy().delete().type(Movie.class).parent(parent).id(idToDelete);
相当于
ofy().delete().key(Key.create(Key.create(MyParentClass.class, myParentId), Movie.class, idToDelete));