0

Android Studio中,我正在尝试从 Android 应用程序中使用Google Clood Datastore 。

使用 Google 示例https://cloud.google.com/datastore/docs/concepts/indexes#Datastore_Indexes_and_properties我可以将 Tom(32 岁)和 Lucy(30 岁)添加为 Acme 公司的 Person 和子项. 我可以看到这两个条目位于 Google Developers Console 的数据存储区中。

  • 如果我设置如下查询过滤器,我可以从 Company Acme 检索孩子。

    Key acmeKey = makeKey("Company", "Acme").build();
    makeFilter("__key__",
        PropertyFilter.Operator.HAS_ANCESTOR,
        makeValue(acmeKey)).build()));
    
    • 如果我只想检索年龄等于 32 的人,我添加到上面的过滤器 makeFilter("age", PropertyFilter.Operator.EQUAL, makeValue(32)).build() 然后,我得到了人汤姆。

  • 但是,如果不是Operator.EQUAL我放置一个不等式过滤器,Operator.LESS_THAN或者Operator.GREATER_THAN我得到错误“找不到匹配的索引”。

我认为这是索引的问题,但我真的不明白如何设置索引。我使用 Android Studio,我根本不使用 App Engine。我只想像使用 MySQL 一样使用简单的WHERE age > 32.

顺便说一句,我尝试使用 GQL 并遇到完全相同的问题,使用EQUAL,但不使用GREATER_THAN(在https://developers.google.com/apis-explorer中相同)。

那么,有人知道我该如何解决这个问题吗?谢谢 !!

4

2 回答 2

2

Cloud Datastore 的索引配置是使用gcd.sh工具处理的。

如果您能够针对由gcd.sh. 该工具可以准确确定您需要哪些索引,然后您可以使用该updateindexes命令在您的生产应用程序上配置它们。

如果没有,也可以手动配置索引:

  1. gcd.sh create <project> -d <project>
  2. 创建一个包含<project>/WEB-INF/datastore-indexes.xml以下内容的文件:

<?xml version="1.0" encoding="utf-8"?> <datastore-indexes autoGenerate="true"> <datastore-index kind="Company" ancestor="true"> <property name="age" direction="asc" /> </datastore-index> </datastore-indexes>

  1. gcd.sh updateindexes <project>

该文件的确切内容将取决于您要运行的查询。此页面提供有关索引文件格式的更多详细信息。

于 2015-03-17T17:20:32.580 回答
0

所以,正如 Ed Davisson 刚才所说,一切都是用 gcd 完成的。

我花了很多时间才明白该怎么做,所以我把我的经验放在下面,也许它会对某人有所帮助。我正在使用Ubuntu,我不知道其他操作系统。

  1. Downloads文件夹中下载gcd-v1beta2-rev1-2.1.1.zip
  2. 解压下载的文件
  3. 在控制台中,转到解压缩的文件夹cd Downloads/gcd-v1beta2-rev1-2.1.1
  4. 然后,./gcd.sh create -d myDataset myProjectNamemyDatasetGoogle Developers Console中的项目 ID (由 2 个随机名词和一个数字组成)
  5. 转到解压缩的文件夹gcd-v1beta2-rev1-2.1.1,您应该会看到一个文件夹myProjectName。在这个myProjectName文件夹中,在WEB-INF文件夹中创建一个文件datastore-indexes.xml
  6. 因为我想检索拥有祖先公司且年龄超过 20 岁的,所以我不得不像 Ed Davisson 所说的那样添加索引

    <?xml version="1.0" encoding="utf-8"?>
    <datastore-indexes autoGenerate="true">
     <datastore-index kind="Person" ancestor="true">
       <property name="age" direction="asc" />
     </datastore-index>
    </datastore-indexes>

  7. 在您的控制台中,./gcd.sh updateindexes myProjectName

现在,在 Google Developers Console 中,您可以在Cloud Datastore -> Index下看到这个新索引

最后,您可以检索年龄 > 20 的人

Key acmeKey = makeKey("Company", "Acme").build();
Query.Builder query = Query.newBuilder();
query.addKindBuilder().setName("Person");
query.setFilter(makeFilter(

    makeFilter("__key__",
        HAS_ANCESTOR,
        makeValue(acmeKey)).build(),

    makeFilter("age",
        GREATER_THAN,
        makeValue(20)).build()));

 query.addOrder(makeOrder("age", ASCENDING));
于 2015-03-17T18:06:16.783 回答