首页 文章

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

提问于
浏览
4

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

  • 3

    我想出了问题,魏浩在上面的评论中是对的 . 似乎在某些时候,我插入了一个测试String作为longDescription而不是Text . 我将把这一点归结为从学校中获得的经验教训,因为它是数据存储区的一个菜鸟 .

    对于遇到这个问题的其他人来说,答案是:如果你在查询结果列表中进行迭代,那么 make sure 就会回复你对 every 结果的期望!请记住,这不是RDBMS,并且每个实体可以为同一属性使用不同的数据类型 . 所以,是的,您可以拥有1,572,394个实体,其中longDescription是一个Text,一个实体,其中longDescription是一个String,这将使您感到困扰 .

    这是一个可能有助于诊断此问题的小代码片段:

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

相关问题