好的,伙计们,事情是这样的,我有一个应用程序使用 ODATA 服务
,在 SMP 服务器
中,我得到这样的数据:
public class callService extends AsyncTask<Void, Void, ArrayList<String>>
{
public ArrayList<String> doInBackground(Void... params)
{
ODataConsumer c = ODataJerseyConsumer.create("http://MyUrlService:8080");
List<OEntity> listEntities = c.getEntities("MYENTITYTOCONSUME").execute().toList();
System.out.println("Size" + listEntities.size());
if (listEntities.size() > 0)
{
for (OEntity entity : listEntities)
{
zmob_kunnr.add((String) entity.getProperty("Name1").getValue()
+ " - "
+ entity.getProperty("Kunnr").getValue().toString());
}
}
return zmob_kunnr;
}
protected void onPostExecute(ArrayList<String> result)
{
super.onPostExecute(result);
adapter = new ArrayAdapter<String>(ConsumoKnuur.this, android.R.layout.simple_list_item_1, result);
list.setAdapter(adapter);
}
}
好的,我从网络上得到了这个解决方案,可以实现为列表,我需要存储这个实体,它是一个客户列表,并从这个实体中获取两个属性并保存在我的数据库中,所以:
Entity Customer:Custormer_ID, Customer_Name
这是调用 sqlite 的代码:
public void sqlite()
{
sql_obj.open();
sql_obj.deleteAll();
for(int i=0; i < zmob_kunnr.size(); i++)
{
sql_obj.insert(zmob_kunnr.get(i).toString(), zmob_kunnr.get(i).toString() );
}
sql_obj.close();
}
还有我的 SQLite:
private static final String TABLE_CLIENTE = "CREATE TABLE "
+ TB_CLIENTE
+ "(ID_CLIENTE INTEGER PRIMARY KEY AUTOINCREMENT, " //Id for controller my logics
+ " Kunnr TEXT , " //customer ID
+ " Name1 TEXT );"; //customer_name
public long insert(String name1, String Kunnr)
{
ContentValues initialValues = new ContentValues();
initialValues.put("Name1", Name1); //Customer_Name
initialValues.put("Kunnr", Kunnr); //Customer_ID
return database.insert(TB_CLIENTE, null, initialValues);
}
当然还有我的其他方法,这并不重要,所以当我在 sql 调用方法中运行“for”时发生了什么,我得到了列表和行的 size()
每次都将整个行存储在数据库的一列中,所以我得到了两个具有相同值的不同表,
我怎样才能改变解决这个问题而不是在我需要在数组中消费的列表中消费?或者我需要创建一个获取列表值的方法,并在 ,
(coma) 之后创建两个不同的对象来存储这些数据?
我在网上找了半天也没找到,可能是我还不知道,怎么会这样,我也不知道我在找什么,我用的是odata4j API
这里是文档的链接,http://odata4j.org/v/0.7/javadoc/
我是编程新手,所以我真的遇到了麻烦,任何帮助的建议都是真实的,感激,
非常感谢,祝您有愉快的一天!!!
最佳答案
您可以通过执行以下操作将每个实体添加到“ArrayList”数组:
for (OEntity entity : listEntities) {
zmob_kunnr.add(entity);
}
这将允许您在插入数据库时通过 getProperty()
访问包含在实体中的数据。
也不需要下面的语句,因为 for each循环遍历列表中的每个元素,因此如果列表为空,for (OEntity entity : listEntities)
将不会执行。
if (listEntities.size() > 0) {
...
}
如果您有多个 ODataConsumers
,您有两种选择,具体取决于您的要求(如果我理解您的问题正确的话):
- 可以依次获取每个
ODataConsumer
,获取listEntities
,添加到zmob_kunnr
列表中,列表项添加完成后到数据库,清除zmob_kunnr
列表,并使用新的 URL 调用doInBackground
。这是您当前的解决方案所允许的。
在将值读入数据库时,似乎需要知道哪个属性与 URL 相关联。您可以使用 POJO 作为实体及其属性列表的持有者。您现在可以添加和删除属性。请注意,属性将按照插入时的相同顺序删除。
public class OEntityHolder {
private final OEntity entity;
private Queue<String> properties;
public OEntityHolder(OEntity entity) {
this.entity = entity;
this.properties = new LinkedBlockingQueue<>();
}
public OEntity getEntity() {
return this.entity;
}
public void addProperty(String property) {
this.properties.add(property);
}
public void removeProperty() {
this.properties.poll();
}
}
这将需要更改包含实体
的列表:
ArrayList<OEntityHolder> zmob_entity_holders = new ArrayList<>();
如果您想同时添加来自不同 URL 的所有 entities
,您将需要在调用 doInBackground
时访问所有 URL。像这样:
public ArrayList<OEntityHolder> doInBackground(Void... params) {
String [][] urls = {{"http:MyUrl/ZMOB_FECODSet", "Name1", "Fecod"},
{"http:MyUrl/ZMOB_OTEILSet", "Name2", "Oteil"},
{"http:MyUrl/ZMOB_KUNNRSet", "Name3", "Kunnr"},
{"http:MyUrl/ZMOB_BAULTSet", "Name4", "Bault"}};
for (String [] urlProp:urls) {
//Here you get the list of entities from the url
List<OEntity> listEntities = ODataJerseyConsumer.create(urlProp[0]).getEntities("MYENTITYTOCONSUME").execute().toList();
for (OEntity entity:listEntities) {
OEntityHolder holder = new OEntityHolder(entity);
for (int i = 1; i < urlProp.length; i++)
holder.addProperty(urlProp[i]);
zmob_entity_holders.add(holder);
}
}
//At this point, all of the entities associated with the list of URLS will be added to the list
return zmob_entity_holders;
}
您现在拥有与 zmob_kunnr
中的 URL 列表关联的所有实体。在你可以并且可以像这样将 then 插入数据库之前:
for (OEntityHolder holder : zmob_entity_holders) {
sql_obj.insert(holder.getEntity().getProperty(holder.removeProperty()).toString(), holder.getEntity().getProperty(holder.removeProperty()).toString());
}
如果每个实体都有关联的名称,您可以将名称存储在 map 中,其中 key
是 URL,value
是名称。
HashMap<String, String> urlEntityNames = new HashMap<>();
urlEntityNames.put("http://MyUrlService:8080", "MYENTITYTOCONSUME");
...//Add more URLs and entity names
然后,您可以在遍历实体列表时,在 map 中进行查找以找到正确的名称:
List<OEntity> listEntities = ODataJerseyConsumer.create(url).getEntities(urlEntityNames.get(url)).execute().toList();
我希望这对您有所帮助,如果我误解了您,请在评论中纠正我。
编辑:添加了 URL、持有者和数据库插入列表。
关于java - 如何从列表转换为数组?安卓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27294637/