如何从app引擎数据存储区获取文本?

时间:2012-07-09 05:05:54

标签: java google-app-engine google-cloud-datastore

有人可以告诉我如何使用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...>

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

2 个答案:

答案 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();}