ios - 将 Objectify 索引添加到现有属性和现有实体?

标签 ios google-app-engine google-cloud-endpoints objectify

我正在使用 Objectify 存储一个实体,现在想添加一个 index到属性之一以运行查询。

该实体来自通过 Google Cloud Endpoints 连接的 iOS 客户端。它设置由 ServiceGenerator 生成的 Objective-C 类中的属性。 .

所以我尝试添加一个 @Index在 Eclipse 中为属性添加注释并使用 appcfg 再次上传项目.但是,当我在 Google Developers Console 中检查数据存储时,仍然显示“没有索引服务”,并且如果我创建新实体并在(现在已编入索引的)属性上运行 Objectify 查询,仍然会返回零项。

那么,为了在 Eclipse 项目中使用 Objectify 注释定义的现有实体的现有属性添加索引,我必须执行哪些确切步骤?

This问答表明它应该是直截了当的,但由于某种原因(显然)不是。也许复杂性源于 Google Cloud Endpoints 和 Objective-C 客户端的参与。

更新 以下是一些相关的代码片段,根据要求:

属性定义如下:

@Entity
@Cache
public class SomeEntity {
    @Id public String someID;
    @Index String someProperty
}

iOS 客户端将属性设置如下(依赖于 ServiceGenerator 生成的 Objective-C 类):
someEntity.someProperty = @"someString";

服务器接收并保存实体如下:
@ApiMethod
public AddEntityResponse addEntity(AddEntityRequest request, HttpServletRequest httpServletRequest) throws ServletException {
    SomeEntity someEntity = request.someEntity;
    someEntity.someID = UUID.randomUUID().toString();
    ofy().save().entity(someEntity).now();
    // ...
}

当服务器运行以下查询时,它接收到零个项目,尽管具有给定属性值的实体存在(例如,在数据存储查看器中可见):
ofy().load().type(SomeEntity.class).filter("someProperty", "someString").list();

最佳答案

为了向现有实体添加索引,您必须执行以下简单步骤:

  • Annotate your properties with @Index
  • Save the existing entity

  • 第 2 点的原因是因为注释您的实体本身是不够的,因为在 DataStore您的数据不受影响。您必须明确地重新保存现有实体以强制 Datastore为新注释的属性创建索引。

    删除索引时也是如此。您必须重新保存才能使更改生效。

    编辑

    从您的代码片段中,我可以看到您的查询不太正确。您正在调用 query type(...) 返回的对象上的方法实现LoadType接口(interface),但两个接口(interface)都不是由 [LoadType][1] 扩展的(即 LoadIdsQuery 定义该方法!我假设您还没有创建自己的包装器,因为您的代码看起来像标准的 objectify,所以我不确定您的代码是如何编译的,或者在运行时不会爆炸。

    无论如何要修复,因为看起来您想要做的是按指定谓词过滤,所以将您的查询更改为:
    ofy().load().type(SomeEntity.class).filter("someProperty", "someString").list();
    

    关于ios - 将 Objectify 索引添加到现有属性和现有实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25360656/

    相关文章:

    ios - 如何使用 Swift 在 iOS 中防止视频放大/缩小?

    ios - `Identifiable` 一致性返回类型泛型作为变量

    google-app-engine - 403 Forbidden 本地 Google Cloud Storage 调用

    python - 使用 `django` 和 `css` 进行 App 引擎验证

    iOS XMPP 在对话屏幕中收到消息

    node.js - 无法将文件读取流从 Google Cloud Storage 传输到 Google Drive API

    google-app-engine - Polymer 和谷歌云端点 Go 后端

    javascript - 我可以处理 gapi.client.load promise 的错误吗?

    google-app-engine - GAE 云端点 - 部署后 Api 未更新

    ios - 在 Swift 的 Controller 中传输值的问题