【问题标题】:How to get text from app engine datastore?如何从应用引擎数据存储中获取文本?
【发布时间】: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


【解决方案1】:

这是我的代码;

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

【讨论】:

    【解决方案2】:

    我发现问题了,上面的cmets中,魏豪是对的。似乎在某个时候,我插入了一个测试字符串作为 longDescription 而不是 Text。我将把这归结为从学校的硬敲门中吸取的教训,因为我对数据存储有点菜鸟。

    对于遇到此问题的其他任何人,答案是:如果您正在遍历查询结果列表,确保您在 上得到了您期望的结果返回的每个结果!请记住,这不是 RDBMS,每个实体都可以为同一属性具有不同的数据类型。所以是的,你可以有 1,572,394 个实体,其中 longDescription 是一个文本,一个实体,其中 longDescription 是一个字符串,这会让你感到沮丧。

    这里有一个小代码 sn-p 可能有助于诊断这个问题:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 2011-04-30
      • 2019-01-24
      • 2012-06-23
      • 1970-01-01
      • 2011-02-10
      • 2014-10-21
      相关资源
      最近更新 更多