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

时间:2015-04-01 18:25:49

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

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

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

enter image description here

以下是我需要提取数据的一些代码:

//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)]:      。或者:Key String =!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.

2 个答案:

答案 0 :(得分:2)

你试过这个吗?

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

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

答案 1 :(得分: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();
        }