2011-06-03 38 views
0

我正在嘗試odata4j在我的android應用程序中檢索可從WCF服務訪問的數據庫中的數據。getEntity調用導致崩潰(在WCF服務上使用odata4j)

ODataConsumer co = ODataConsumer.create("http://xxx.xx.xx.xxx:xxxx/Users"); 
for(OEntity user : co.getEntities("Users").execute()) 
{ 
     // do stuff 
} 

但是,這在調用getEntities時崩潰了。我也嘗試了各種其他調用,如

Enumerable<OEntity> eo = co.getEntities("Users").execute();    
OEntity users = eo.elementAt(0); 

但是,這也崩潰在eo.elementAt(0)。

logcat不會告訴我任何事情,並且調用堆棧似乎在ActivityThread.performLaunchActivity中暫停。

另一方面,在我的網頁瀏覽器中輸入「http:// localhost:xxxx/Users」,按預期工作,並以xml格式返回我的數據庫中的用戶。

關於如何調試的任何想法?

回答

0

我想調用應該是:

ODataConsumer co = ODataConsumer.create("http://xxx.xx.xx.xxx:xxxx"); 
for(OEntity user : co.getEntities("Users").execute()) 
{ 
    // do stuff 
} 

create定義要連接,但Users是你要查詢的資源服務。

+0

啊傻我 - 是的,我最初嘗試過。我已經從創建的通話中刪除了「用戶」,但它仍然掛在getEntities :( – 2011-06-03 18:42:33

+0

只需首先檢查 - 您的Android應用程序是否可以訪問該地址?否則,您可以使用Fiddler之類的東西,並比較來自瀏覽器的請求和來自android的請求? – 2011-06-03 18:46:29

+0

是的,如果我使用HttpGet代替,我的Android可以訪問地址。不幸的是,當我跨越getEntities循環時,Fiddler不會顯示任何新項目。 – 2011-06-03 18:53:46

1

要記錄所有的HTTP請求/響應:

ODataConsumer.dump.all(true); 

的URI傳遞給消費者.create調用應該是服務的根。例如.create( 「http://xxx.xx.xx.xxx:xxxx/」);否則你的代碼看起來很好。

請注意Enumerable的行爲類似.net類型 - 枚舉被推遲到訪問。如果你計劃在結果中多次索引,我建議你先調用.toList()。

讓我知道你發現了什麼。

希望幫助,
約翰 -

+0

感謝您的提示。在ODataConsumer.dump.all(true)之後,所有http請求\響應都會被記錄到哪裏? 是的我修改了我的創建方法的網址,但它仍然崩潰:( – 2011-06-03 21:15:33

0

你可以試試這個方法。

OEntity oEntity;  
     OQueryRequest<OEntity> oQueryRequest= oDataJerseyConsumer.getEntities(entityName); 
     List<OEntity> list= oQueryRequest.execute().toList(); 

     for (OEntity o : list) { 
       List<OProperty<?>> props = o.getProperties(); 
       for (OProperty<?> prop : props) { 
        System.out.println(prop.getValue().toString()); 

       } 

     } 
相關問題