如何使用Java从Google App Engine数据存储中的实体提取属性
我正在使用谷歌应用程序引擎,试图从数据存储中查询/提取数据。我已经学习了近20种不同的教程,但没有任何运气 下面是我的数据存储的图片以及我存储在其中的各个示例数据: 以下是我必须提取数据的一些代码:如何使用Java从Google App Engine数据存储中的实体提取属性,java,google-app-engine,entity,google-cloud-datastore,gql,Java,Google App Engine,Entity,Google Cloud Datastore,Gql,我正在使用谷歌应用程序引擎,试图从数据存储中查询/提取数据。我已经学习了近20种不同的教程,但没有任何运气 下面是我的数据存储的图片以及我存储在其中的各个示例数据: 以下是我必须提取数据的一些代码: //To obtain the keys final DatastoreService dss=DatastoreServiceFactory.getDatastoreService(); final Query query=new Query("Coupon"); List<Key>
//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.geti.toString;-实体[!全局:Coupon123/Couponno id]:
. 或:键字符串=!全球:Coupon5730827476402176
我已经尽我所能地遵循了文档和一些示例,但我似乎无法理解它。有没有人对如何从实体中获取属性有过任何建议或经验,而这些属性不返回null
我已经完成了以下Stackoverflow问题,但没有任何成功,因此请不要使用简单的重复问题标记来结束此问题:
1.
2.
3.
4.
5.你试过这个吗
//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是完全正确的,因为我正在查询以获取密钥,构建一个新实体,然后尝试解析新创建的空实体 解决方案是利用PersistenceManager解析数据,然后使用getter/accessor方法来解析数据。持久性管理器的链接在这里,我或多或少是直接从中复制的,因为它工作得很好: 设置持久性管理器后,我可以使用以下代码让它提取数据:
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();
}
正常的方法似乎是使用getProperty,然后命名属性,而不是getPropertiesIndeed you's right,代码中的行:myEntity.getPropertydesc;正在尝试执行此操作,但返回null。我尝试了地图测试的getProperties调用,但也没有成功。哦,哇,我错过了那个。对不起,我很抱歉:P我下次一定要把代码通读一遍,不要只看一行。你什么时候把你的实体放进去?我们能完全排除最终的一致性吗?我想我知道你在做什么。您正在执行一个查询以获取所有键,然后使用相同的键构建一个新实体,使其为空实体,然后请求该新实体的参数。您决不会要求使用服务器返回的实体;这是一个很好的想法,但不幸的是,问题围绕着我,我有一个空的物体。我更新了代码以显示我提出的解决方案