我正在使用 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]
扩展的(即 LoadIds
和 Query
定义该方法!我假设您还没有创建自己的包装器,因为您的代码看起来像标准的 objectify,所以我不确定您的代码是如何编译的,或者在运行时不会爆炸。无论如何要修复,因为看起来您想要做的是按指定谓词过滤,所以将您的查询更改为:
ofy().load().type(SomeEntity.class).filter("someProperty", "someString").list();
关于ios - 将 Objectify 索引添加到现有属性和现有实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25360656/