【问题标题】:Objectify: delete entire row by idObjectify:按 id 删除整行
【发布时间】:2015-11-25 13:30:31
【问题描述】:

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

                }
            }
        }

【问题讨论】:

  • 当您说不起作用时....您是否收到错误消息?您需要明确解释“不起作用”的含义。
  • 刚刚查看了您的个人资料。您有 7 个问题,您都没有接受答案。如果您重视他人的帮助,您应该支持有用的答案并接受解决方案。否则,将来人们可能会变得不太愿意帮助您。
  • @konqi 再次感谢您的耐心和帮助。我会接受答案,抱歉没有早点这样做。

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


【解决方案1】:

在这种情况下(删除所有以演员身份出演布拉德皮特的电影),您可以像这样删除实体:

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

【讨论】:

  • 再次感谢!不幸的是它没有用,我有一个错误:`99% 端点配置未更新。当 Google Cloud Endpoints 服务器尝试与其通信时,该应用返回错误。 com.google.appengine.tools.admin.AppVersionUpload checkEndpointsServingStatusResult 99% 有关详细信息,请参阅部署故障排除文档:developers。 99% 忽略端点故障并继续更新。严重:端点配置未更新。当 Google Cloud Endpoints 服务器尝试与其通信时,该应用返回错误。
  • @GidiSprintzin 这看起来完全是一个不同的问题。请使用 MCV 示例 (stackoverflow.com/help/mcve) 打开一个新问题,以便我们对其进行分析。作为起点,我将清理项目并进行全面重建。
  • 我认为我的代码的问题是,在该字段中我有一个看起来像这样的数组:[{"stringValue":"yyy","indexed":false},{"stringValue":"Brad Pitt","indexed":false},{"stringValue":"jhon13","indexed":false}],我不知道如何提取名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
  • 1970-01-01
  • 2021-12-26
  • 2012-05-05
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多