有人可以告诉我如何使用Java从Google App Engine数据存储中获取Text值吗?我在数据存储区中有一些实体,其中有一个名为longDescription的Text属性。当我尝试这个时:
DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
Query q = new Query("Items");
PreparedQuery pq = ds.prepare(q);
for (Entity result : pq.asIterable()) {
Text longDescription = (Text)result.getProperty("longDescription");
}
我在longDescription分配行上收到此警告:
WARNING: /pstest
java.lang.ClassCastException: java.lang.String cannot be cast to
com.google.appengine.api.datastore.Text
我绝对在这里闷闷不乐。我的代码中的 only 字符串是用于获取正确属性的文字“longDescription”。如果我把它放在分配线上方:
log.warning("Type is " + (result.getProperty("longDescription")).getClass());
我看到以下输出:
WARNING: Type is class com.google.appengine.api.datastore.Text
好的,所以result.getProperty(“longDescription”)确实是一个正在作为对象传回的Text对象。我甚至尝试使用完全限定名称(com.google.appengine.api.datastore.Text)而不仅仅使用具有相同结果的文本。字符串演员在哪里?更重要的是,如何从数据存储中获取该文本?我在这里结束了我的智慧,任何帮助都会受到赞赏!
哦,还有一个可能相关的注意事项:这是我在将属性插入数据存储区时使用的赋值:
Entity eItem = new Entity("Items");
eItem.setProperty("longDescription", new Text(req.getParameter("ldes")));
ds.put(eItem);
当我在管理控制台中查看说明时,它似乎超过500个字符,它显示如下:
<Text: This is a long form description of an item in the store that is access...>
插入时我搞砸了什么?如果是这样,如何将文本项插入数据存储区?
答案 0 :(得分:4)
我想出了问题,魏浩在上面的评论中是正确的。似乎在某些时候,我插入了一个测试字符串作为longDescription而不是Text。我打算把这一点当作从学校里学到的经验教训,因为这是一个与数据存储区相似的菜鸟。
对于遇到此问题的其他任何人,答案是:如果您在查询结果列表中进行迭代,确保您正在恢复对的期望每个结果都会回来!请记住,这不是RDBMS,并且每个实体可以为同一属性使用不同的数据类型。所以,是的,您可以拥有1,572,394个实体,其中longDescription是一个文本,一个实体,其中longDescription是一个字符串,这将使您感到困扰。
这是一个可能有助于诊断此问题的小代码片段:
DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
Query q = new Query("Items");
PreparedQuery pq = ds.prepare(q);
for (Entity result : pq.asIterable()) {
if (longDescription isinstanceof Text)
Text longDescription = (Text)result.getProperty("longDescription");
else
log.severe("Unexpected datatype: longDescription is a "
+ result.getProperty("longDescription").getClass().toString());
}
答案 1 :(得分:0)
这是我的代码;
DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
Query q = new Query(entityKind);
PreparedQuery pq = ds.prepare(q);
for (Entity e : pq.asIterable()) {
String longtext = ((Text)e.getProperty("somelongdescription")).getValue();}