Java 如何从应用程序引擎数据存储中获取文本?

Java 如何从应用程序引擎数据存储中获取文本?,java,google-app-engine,google-cloud-datastore,Java,Google App Engine,Google Cloud Datastore,有人能告诉我如何使用Java从Google App Engine数据存储中获取文本值吗?我在数据存储中有一些实体,它们具有名为longDescription的文本属性。当我尝试这个: DatastoreService ds = DatastoreServiceFactory.getDatastoreService(); Query q = new Query("Items"); PreparedQuery pq = ds.prepare(q); for (Entity result : pq.a

有人能告诉我如何使用Java从Google App Engine数据存储中获取文本值吗?我在数据存储中有一些实体,它们具有名为longDescription的文本属性。当我尝试这个:

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
log.warning("Type is " + (result.getProperty("longDescription")).getClass());
我在这里真是受够了。代码中唯一的字符串是用于获取正确属性的文本“longscription”。如果我把它放在作业线上方:

WARNING: /pstest
java.lang.ClassCastException: java.lang.String cannot be cast to
    com.google.appengine.api.datastore.Text
log.warning("Type is " + (result.getProperty("longDescription")).getClass());
我看到以下输出:

WARNING: Type is class com.google.appengine.api.datastore.Text
好的,所以result.getProperty(“longDescription”)实际上是一个作为对象传回的文本对象。我甚至尝试过使用完全限定的名称(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...>


我插东西时把东西弄坏了吗?如果是这样,如何将文本项插入到数据存储中?

我发现了问题,魏浩在上面的评论中是正确的。似乎在某个时候,我插入了一个测试字符串作为长描述而不是文本。我将把这归因于我从学校的重击中学到的一课,因为我在数据存储方面有点不在行

对于遇到这个问题的任何其他人来说,答案是:如果您正在迭代查询结果列表,请确保返回的每个结果都返回了您期望的结果!记住,这不是一个RDBMS,对于同一个属性,每个实体都可以有不同的数据类型。是的,您可以有1572394个实体,其中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());
}
这是我的密码

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

似乎
result.getProperty(“longDescription”)
正在返回一个字符串。既然它只是字符串的一个更大的容器,为什么不直接使用字符串呢?或者,如果需要使用文本对象,请使用查询结果创建新的文本对象?我不确定您的问题是要从数据存储中获取文本对象还是要将文本对象插入数据存储中。我确定
result.getProperty(“longDescription”)
没有返回字符串。如果我记录
(result.getProperty(“longDescription”).getClass().toString()
,它告诉我它是
class com.google.appengine.api.datastore.Text
。实际上,我正在尝试将文本转换为字符串,我知道如何进行转换(在Text中使用
getValue()
方法)。问题是首先从数据存储中获取文本。如果result.getProperty(“longDescription”)返回字符串,它不能类型转换为文本吗?比如((Text)entity.getProperty(“longDescription”).getValue()。为什么它抛出类型转换异常?