有人可以告诉我如何使用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
我绝对在这里闷闷不乐 . 我的代码中唯一的字符串是文字"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...>
插入时我搞砸了什么?如果是这样,如何将文本项插入数据存储区?
2 回答
我想出了问题,魏浩在上面的评论中是对的 . 似乎在某些时候,我插入了一个测试String作为longDescription而不是Text . 我将把这一点归结为从学校中获得的经验教训,因为它是数据存储区的一个菜鸟 .
对于遇到这个问题的其他人来说,答案是:如果你在查询结果列表中进行迭代,那么 make sure 就会回复你对 every 结果的期望!请记住,这不是RDBMS,并且每个实体可以为同一属性使用不同的数据类型 . 所以,是的,您可以拥有1,572,394个实体,其中longDescription是一个Text,一个实体,其中longDescription是一个String,这将使您感到困扰 .
这是一个可能有助于诊断此问题的小代码片段:
这是我的代码;