odata4j — количество ключей, указанное в URI, не соответствует количеству ключевых свойств для ресурса NorthwindModel.Order_Detail.

Я разрабатываю приложение для Android с использованием OData4J, которое использует эту общедоступную службу данных Northwind.

services.odata.org/northwind/northwind.svc/

и теперь я получаю эту ошибку

Количество ключей, указанное в URI, не соответствует количеству свойств ключа для ресурса NorthwindModel.Order_Details.

это произошло по этой строке кода:

OEntity productALFKI =c.getEntity("Order_Details",productID).execute();

и определение productID было:

   int productID= (Integer) entity2.getProperty("ProductID").getValue();

и это весь код класса MainActivity.java:

package com.example.androwcf1;
 import java.util.ArrayList;
 import java.util.List;
 import org.core4j.Enumerable;
 import org.odata4j.consumer.ODataConsumer;
 import org.odata4j.core.OEntity;
 import org.odata4j.jersey.consumer.ODataJerseyConsumer;
 import org.core4j.Enumerable;
 import org.odata4j.consumer.ODataConsumer;
 import org.odata4j.core.OEntity;
 import org.odata4j.core.ORelatedEntitiesLink;
 import android.app.Activity;
 import android.content.Intent;
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.view.View;
 import android.widget.ArrayAdapter;
 import android.widget.Button;
 import android.widget.ListView;
 public class MainActivity extends Activity {
static int length;
static List<OEntity> listEntities1,listEntities2,listEntities3 ,listEntities4,listEntities5;
Button call;
ListView list;
static ArrayList<String> products,categories;
static  List<String> customers1Title,products1Title,order_details1Title,customers10,customers11,products10,order_details10,order_details11,orders10,orders11,arr,returned_arr,returned_arr_Title;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
           setTitle("WCF Example");
 call = (Button) findViewById (R.id.mybtn);
 list = (ListView) findViewById(R.id.mylistview);
 products = new ArrayList<String>();
 categories = new ArrayList<String>();
 customers1Title = new ArrayList <String>();
 products1Title = new ArrayList <String>();
 order_details1Title = new ArrayList <String>();
 customers10 = new ArrayList <String>();
 customers11 = new ArrayList <String>();
 products10 = new ArrayList <String>();
 order_details10 = new ArrayList <String>();
 order_details11= new ArrayList <String>();
 orders10 = new ArrayList <String>();
 orders11 = new ArrayList <String>();
 arr = new ArrayList <String>();
 returned_arr= new ArrayList <String>();
 returned_arr_Title= new ArrayList <String>();
 call.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View arg0) {
 // TODO Auto- generated method stub
 new callService().execute();
  }
  });
 }
  public class callService extends AsyncTask<Void, Void, List<String>> {
  @Override
  protected List<String> doInBackground(Void... params) {
        /////////////////////////////////
      String[] strArray ;
      String strName0,strName1,strName2,strName3,strName4,strName5,strName6;
       String strName0o,strName1o,strName2o ;

 String strName00 = "CustomerID";
 String strName01 = "CompanyName";
     String strName02 = "ProductName";
 String strName03 = "OrderID";
     String strName04 = "EmployeeID";
 String strName05 = "UnitPrice";
 String strName06 = "Quantity";
 returned_arr_Title.add(strName00);
 returned_arr_Title.add(strName01);
 returned_arr_Title.add(strName02);
 returned_arr_Title.add(strName03);
 returned_arr_Title.add(strName04);
 returned_arr_Title.add(strName05);
 returned_arr_Title.add(strName06);
 ////////////////////////////////////////////////////////////////////////
 ODataConsumer c = ODataJerseyConsumer
         .create("http://services.odata.org/Northwind/Northwind.svc");
 OEntity customerALFKI =c.getEntity("Customers", "ALFKI").execute();
   listEntities1 = c.getEntities("Customers").filter("CustomerID eq 'ALFKI'").select("CustomerID,CompanyName").execute().toList();
   listEntities3 = c.getEntities(customerALFKI.getLink("Orders",ORelatedEntitiesLink.class)).select("OrderID,EmployeeID").execute().toList();
   //listEntities5 = c.getEntities(customerALFKI.getLink("Orders",ORelatedEntitiesLink.class)).select("OrderID,EmployeeID").execute().toList();
   strName0o = listEntities1.get(0).getProperty("CustomerID").getValue().toString();
   strName1o = listEntities1.get(0).getProperty("CompanyName").getValue().toString();
 ///////////////////////////////
  if (listEntities3.size() > 0) {
     for (OEntity entity : listEntities3)   {
         int oredrID= (Integer) entity.getProperty("OrderID").getValue();
           strName0 = entity.getProperty("OrderID").getValue().toString();   
           strName1 = entity.getProperty("EmployeeID").getValue().toString();
      OEntity orderALFKI =c.getEntity("Orders", oredrID).execute();
   listEntities4 = c.getEntities(orderALFKI.getLink("Order_Details",ORelatedEntitiesLink.class)).select("ProductID,UnitPrice,Quantity").execute().toList();
  if (listEntities4.size() > 0) {
  for (OEntity entity2 : listEntities4) {
     int productID= (Integer) entity2.getProperty("ProductID").getValue();
       strName2 = entity2.getProperty("ProductID").getValue().toString();
       strName3 = entity2.getProperty("UnitPrice").getValue().toString();
       strName4 = entity2.getProperty("Quantity").getValue().toString();
        customers10.add(strName0o);
       customers11.add(strName1o);         
       orders10.add( strName0);
       orders11.add( strName1);
       order_details10.add( strName3);
       order_details11.add( strName4); 
    OEntity productALFKI =c.getEntity("Order_Details", productID).execute();
     //  listEntities5 = c.getEntities(productALFKI.getLink("Products",ORelatedEntitiesLink.class)).select("ProductName").execute().toList();
       /*    
       if (listEntities5.size() > 0) {
             for (OEntity entity3 : listEntities5) {
   strName5 = entity3.getProperty("ProductName").getValue().toString();
   customers10.add(strName0o);
   customers11.add(strName1o);
   orders10.add( strName0);
   orders11.add( strName1);
   order_details10.add( strName3);
   order_details11.add( strName4); 
   products10.add( strName5);
    }     
     }
    */
    }
      }
      }
     }
   arr.addAll( customers10);
      arr.addAll(customers11);
      arr.addAll( orders10);
      arr.addAll( orders11); 
     // arr.addAll(products10);
      arr.addAll(order_details10);
      arr.addAll(order_details11);
    for(int k3=0; k3<customers10.size(); k3++)
       {
   returned_arr.add(customers10.get(k3));
   returned_arr.add(customers11.get(k3));
 //  returned_arr.add(products10.get(k3));
   returned_arr.add(orders10.get(k3));
   returned_arr.add(orders11.get(k3));
    returned_arr.add(order_details10.get(k3));
   returned_arr.add(order_details11.get(k3));
   ///////////////////////////////////
   } 
  // System.out.println("RESULT="+customers10.size());
   return arr; 
    }
    @Override
    protected void onPostExecute(List<String> result) {
    // TODO Auto-generated method stub
    super.onPostExecute(result);
   Intent i=new Intent(getApplicationContext(), Table1.class);
     startActivity(i);
    }
    }
   }

person omar    schedule 02.03.2014    source источник


Ответы (1)


Вы можете просмотреть метаданные службы "http://services.odata.org/northwind/northwind.svc/$metadata". Затем вы обнаружите, что Order_Detail имеет два ключа

‹ Ключ >

 < PropertyRef Name="OrderID" / >
 < PropertyRef Name="ProductID" / >

‹ /Ключ >

Вам нужно предоставить оба ключа, чтобы получить объект.

person Layla Liu MSFT    schedule 03.03.2014
comment
спасибо, Лейла, но как предоставить оба ключа с помощью odata4j? поскольку функция getEntity принимает один ключ, насколько мне известно, следующим образом: Entity productALFKI =c.getEntity(Order_Details,productID).execute(); есть ли решение от odata4j? - person omar; 03.03.2014
comment
Я думаю, вы можете обратиться к rareddy9-teiid.googlecode.com/hg-history/ для нескольких ключей в odata4j - person Layla Liu MSFT; 06.03.2014