2012-07-09 46 views
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 

我絕對bumfuzzled這裏。 只有我的代碼中的字符串是用來獲取正確屬性的文字「longDescription」。如果我把這個剛分配線以上:

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),而不僅僅是具有相同結果的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...> 

插入時有東西擰了嗎?如果是這樣,你如何將文本項插入數據存儲?

+1

看起來'result.getProperty(「longDescription」)'返回一個字符串。由於[文本](https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/Text)只是一個字符串的較大容器,爲什麼不使用字符串直?或者,如果您需要使用Text對象,請使用查詢結果創建一個新的Text對象?我不確定您的問題是詢問從數據存儲獲取Text對象還是將Text對象插入數據存儲。 – 2012-07-09 05:45:30

+0

我確定'result.getProperty(「longDescription」)'沒有返回一個字符串。如果我記錄'(result.getProperty(「longDescription」))。getClass()。toString()',它告訴我它是'com.google.appengine.api.datastore.Text'類。其實我試圖將文本轉換爲字符串,我知道如何做到這一點(在文本中使用'getValue()'方法)。問題是首先將文本從數據存儲區中取出。 – 2012-07-09 05:51:15

+0

如果result.getProperty(「longDescription」)返回字符串,它不能被類型轉換爲文本?像((文本)entity.getProperty(「longDescription」))。getValue()。爲什麼它會拋出類型轉換異常? – 2016-04-05 11:15:51

回答

3

我想出了問題,魏浩在上面的評論中是正確的。看來在某些時候,我插入了一個測試字符串作爲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()); 
} 
+0

啊,這是原因。很高興你解決了它。 (: – 2012-07-09 06:32:25

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();} 
相關問題