【发布时间】:2012-07-08 12:20:11
【问题描述】:
有人可以告诉我如何使用 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) 而不是仅使用 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...>
插入时我搞砸了什么吗?如果是这样,如何将 Text 项插入数据存储区?
【问题讨论】:
-
看来
result.getProperty("longDescription")正在返回一个字符串。既然Text 只是一个更大的字符串容器,为什么不直接使用字符串呢?或者,如果您需要使用 Text 对象,使用查询的结果创建一个新的 Text 对象?我不确定您的问题是关于从数据存储中获取 Text 对象还是将 Text 对象插入到数据存储中。 -
我确定
result.getProperty("longDescription")没有返回字符串。如果我登录(result.getProperty("longDescription")).getClass().toString(),它告诉我它是class com.google.appengine.api.datastore.Text。我实际上是在尝试将 Text 转换为 String,并且我知道该怎么做(在 Text 中使用getValue()方法)。问题是首先将文本从数据存储中取出。 -
如果 result.getProperty("longDescription") 返回字符串,不能将其类型转换为文本吗?像 ((Text) entity.getProperty("longDescription")).getValue()。为什么会抛出类型转换异常?
标签: java google-app-engine google-cloud-datastore