我需要检查某个字段是否包含特定的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();
}
}
}
答案 0 :(得分:0)
在这种情况下(删除Brad Pitt作为演员的所有电影)你可以删除这样的实体:
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
类有一个父级,这将无法工作,因为你必须始终指定整个密钥,因此对于祖先,该行看起来像这样:
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));