Objectify:按id删除整行

时间:2015-11-25 13:30:32

标签: android google-app-engine delete-row objectify objectify-delete

我需要检查某个字段是否包含特定的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();

                }
            }
        }

1 个答案:

答案 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));