如何使用 Java 从 Google App Engine 数据存储中的实体中提取属性

How do I extract properties from Entities in Google App Engine Datastore using Java

我正在使用 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) and some examples (here) 进行操作,但我似乎无法弄明白。有没有人对如何从实体获取属性而不返回 null 有任何建议或经验?

我已经完成了以下 Whosebug 问题,但没有成功,所以请不要用一个简单的重复问号来关闭它: 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. .

你试过吗?

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

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

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

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

解决方案是利用 PersistenceManager 解析数据,然后使用 getter/ 访问器方法来解析数据。持久性管理器的 link(我或多或少只是直接从中复制,因为它工作得很好)在这里: 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();
        }