【问题标题】:How do I extract properties from Entities in Google App Engine Datastore using Java如何使用 Java 从 Google App Engine Datastore 中的实体中提取属性
【发布时间】:2015-04-01 18:25:49
【问题描述】:

我正在使用 Google App Engine 并尝试从数据存储区查询/提取数据。我已经学习了近 20 个不同的教程,但没有任何运气。

这是我的数据存储区的图片以及我存储在其中的相应示例数据:

这是我必须提取数据的一些代码:

//To obtain the keys
final DatastoreService dss=DatastoreServiceFactory.getDatastoreService();
final Query query=new Query("Coupon");
List<Key> keys = new ArrayList<Key>();

//Put the keys into a list for iteration
for (final Entity entity : dss.prepare(query).asIterable(FetchOptions.Builder.withLimit(100000))) {
    keys.add(entity.getKey());
}

try {
    for (int i = 0; i < keys.size(); i++){
        Entity myEntity = new Entity("Coupon", keys.get(i));

        System.out.println("Size of the Keys array = " + keys.size());

        String description = (String) myEntity.getProperty("desc");

        String endDate = (String) myEntity.getProperty("endDate");

        System.out.println("Description = " + description);
        System.out.println("End Date: " + endDate);

        //Map here is empty...
        Map<String, Object> test = myEntity.getProperties();

        System.out.println("MAP SIZE = " + test.size());        
    }
} catch (Exception e){
    e.printStackTrace();
}

    **OUPUT:** 
    Size of the Keys array = 2
    Description = null
    End date = null
    MAP SIZE = 0

我不知道为什么描述和结束日期为空。它显然拉入了正确的实体,因为尺寸显示为 2,与所示图片匹配。另外,当我打印出钥匙时,它也匹配

(类似这样:对于 keys.get(i).toString(); -- 实体 [!global:Coupon(123)/Coupon(no-id-yet)]: .或者:密钥字符串 = !global:Coupon(5730827476402176)

我已尽我所能遵循文档 (here) 和一些示例 (here),但我似乎无法弄清楚。有没有人有任何关于如何从实体获取属性而不返回 null 的建议或经验?

我已经完成了以下 Stackoverflow 问题,但没有成功,所以请不要用简单的重复问号来关闭它: 1)How do i get all child entities in Google App Engine (Low-level API) 2)Storing hierarchical data in Google App Engine Datastore? 3)How do you use list properties in Google App Engine datastore in Java? 4)Mass updates in Google App Engine Datastore 5)Checking if Entity exists in google app engine datastore..

【问题讨论】:

  • cloud.google.com/appengine/docs/java/javadoc/com/google/…“正常方式”似乎是使用“getProperty”然后命名属性,而不是“getProperties”
  • 确实你是对的,我的代码中的行:myEntity.getProperty("desc");正在尝试这样做,但正在返回 null。我尝试了 getProperties() 调用 Map 测试,但也没有运气。
  • 哦,哇,我错过了那个。很抱歉:P 下次我会确保彻底阅读代码,而不是专注于一行。你什么时候放你的实体?我们可以完全排除最终的一致性吗?
  • 我想我知道你在做什么。您正在执行查询以获取所有键,然后使用相同的键构建一个新实体(因此它是一个空实体),然后您询问该新实体的参数。您绝不会使用服务器返回的实体来询问。
  • Entity myEntity = new Entity("Coupon", keys.get(i));

标签: java google-app-engine entity google-cloud-datastore gql


【解决方案1】:

你试过了吗?

//Put the keys into a list for iteration
for (final Entity entity : dss.prepare(query).asIterable   (FetchOptions.Builder.withLimit(100000))) {


String description = (String) entity.getProperty("desc");

    String endDate = (String) entity.getProperty("endDate");

    System.out.println("Description = " + description);
    System.out.println("End Date: " + endDate);
}

在您的示例中,您创建了实体,并且预计属性将为空

【讨论】:

  • 这是个好主意,但遗憾的是,问题围绕着我完全没有一个空对象。我更新了我的代码以显示我想出的解决方案
【解决方案2】:

尤里卡!非常感谢所有回答。 Patriceuser2649908 特别感谢您引导我找到答案。

所以,Patrice 是完全正确的,因为我正在查询以获取密钥、构建新实体,然后尝试解析新创建的(空)实体。

解决方案是利用 PersistenceManager 解析数据,然后使用 getter/accessor 方法来解析数据。持久性管理器的链接(我或多或少只是直接复制,因为它运行良好)在这里: How to use JDO persistence manager?

一旦我设置了持久性管理器,我就可以让它使用以下代码提取数据:

try {
            for (int i = 0; i < keys.size(); i++){

                //See the link for How to use JDO persistence manager on how to use this
                PersistenceManager pm = MyPersistenceManagerClass.getPM();

                //Need to cast it here because it returns an object
                Coupon coupon = (Coupon) pm.getObjectById(Coupon.class, keys.get(i));

                System.out.println("Created by = " + coupon.getCreatedBy());

                System.out.println("Description = " + coupon.getDesc());

                System.out.println("Modified by = " + coupon.getModifiedBy());
            }
        } catch (Exception e){
            e.printStackTrace();
        }

【讨论】:

    猜你喜欢
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多