4

有人可以告诉我如何使用 Java 从 Google App Engine 数据存储中获取文本值吗?我在数据存储中有一些实体,其中包含名为 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) 而不是仅使用 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...>

我是不是在插入的时候搞砸了什么?如果是这样,您如何将文本项插入数据存储区?

4

2 回答 2

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());
}
于 2012-07-09T06:30:23.983 回答
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();}
于 2013-07-12T14:27:09.533 回答