想实现一个功能即让android访问远程数据库,但是网上很多人都不建议直连。据说问题多多。那么中间就加个第三者吧。

实现思路:在数据库和android客户端添加一个webservice,处理每次客户端发来的请求。而在android客户端使用ksoap2解析webservice返回的数据。

一 webservice 端,我使用序列化的方式实现的。不知道这里跟xml的实现哪个对手机来说更好。这里先放下,以后研究。

1.我使用的是xfire。新建一个webservice项目,然后我们开始写代码

2.一个接口

public interface ICompany {public List<Company> getCompanyList();}

3一个实现类

public class ICompanyImp implements ICompany {CompanyDAO comdao=new CompanyDAO();//得到所有公司列表public List<Company> getCompanyList() {List<Company> list=new ArrayList<Company>();try {list=comdao.getCompanyList();} catch (SQLException e) {e.printStackTrace();list=null;}return list;}}

注意:我这里的返回值是list,不少webservice的基本类型,所以需要为它配置文件 接口+.aegis.xml

4 接口+.aegis.xml

<?xml version="1.0" encoding="UTF-8"?><mappings>    <mapping>    <!--          <method name="getCollectionsRowCount">            <parameter index="0" componentType="java.lang.String"/>        </method>        -->        <!-- 返回的类型是Map的话,做法和List一样。但定义的类型,是Map中的Value部分 -->        <method name="getCompanyList">             <return-type componentType="bean.Company"/>        </method>    </mapping></mappings>

5.service.xml

<?xml version="1.0" encoding="UTF-8"?><beans ><service xmlns="http://xfire.codehaus.org/config/1.0"       xmlns:s="http://www.springframework.org/schema/beans"        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"><name>MyService</name><serviceClass>main.service.ICompany</serviceClass><implementationClass>main.service.ICompanyImp</implementationClass><style mce_bogus="1">wrapped</style><use>literal</use><scope>application</scope><namespace>http://android.googlepages.com/</namespace></service></beans>

发布项目后,运行效果如图:





项目结构:





二 android客户端


因为ksoap2解析webservice得到的数据类似于以下:getCompanyListResponse{out=anyType{Company=anyType{company=安徽江淮汽车股份有限公司; id=1; }; }; }

1 解析类:MyWebServiceHelper

public class MyWebServiceHelper {// WSDL文档中的命名空间       private static final String targetNameSpace = "http://android.googlepages.com/";            // WSDL文档中的URL       private static final String WSDL = "http://192.168.1.144:8080/oilservice/services/MyService";      // 需要调用的方法名(获得Myervices中的helloWorld方法)             //需要调用的方法名(获得Myervices中的login方法)       private static final String getCompany="getCompanyList";             public List<Company>  getCompanyList( ) {          List<Company> list=new ArrayList<Company>();                SoapObject request =new SoapObject(targetNameSpace,getCompany);                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(                  SoapEnvelope.VER11);                 envelope.dotNet = false;         envelope.setOutputSoapObject(request);                 AndroidHttpTransport  httpTranstation = new AndroidHttpTransport (WSDL);         try {              httpTranstation.call(targetNameSpace+getCompany, envelope);              SoapObject soapObject = (SoapObject) envelope.getResponse();                 //如果获取的是个集合,就对它进行下面的操作                if(soapObject.getName()=="anyType") {                    //遍历Web Service获得的集合                    for(int i=0;i<soapObject.getPropertyCount();i++){                        Company m=new Company();                                               //获取单条的数据                        SoapObject soapChilds =(SoapObject)soapObject.getProperty(i);                                                //对单个的数据进行再次遍历,把它的每行数据读取出来                        m.setId(Integer.parseInt(soapChilds.getProperty("id").toString()));                        m.setCompany(soapChilds.getProperty("company").toString());                                                  /*                             //获取实体类的所有属性                            Field[] field = m.getClass().getDeclaredFields();                                                         //遍历所有属性,第一个是序列化的id,serialVersionUID,用不到。                            for(int j=0 ; j<field.length ; j++){                                    //获取属性的名字                                String name = field[j].getName();                                   System.out.println(name);                                                           }*/                       // }                                           list.add(m);                    }            }                            } catch (IOException e) {              e.printStackTrace();          } catch (XmlPullParserException e) {              e.printStackTrace();          }                  return list;      }  }  

2 实现类:

public class OilActivity extends Activity {    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                Spinner spinner = (Spinner) findViewById(R.id.company);                ArrayAdapter<String>  adapter = new ArrayAdapter<String>(                this,android.R.layout.simple_spinner_item);        adapter.setDropDownViewResource(                android.R.layout.simple_spinner_dropdown_item);               //调用自已写的webService           MyWebServiceHelper webServiceHelper=new MyWebServiceHelper();      List<Company> compnayList=  webServiceHelper.getCompanyList();              for(int i=0;i<compnayList.size();i++){      adapter.add(compnayList.get(i).getCompany());      }                spinner.setAdapter(adapter);    }}

3 两个项目中都用到的bean

public class Company implements Serializable{private static final long serialVersionUID = 1L;private int id;private String company;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getCompany() {return company;}public void setCompany(String company) {this.company = company;}}

最后测试以下,list返回正确。效果图:



3项目结构:



参考文章:

http://ksoap2.sourceforge.net/doc/api/ksoap2的API

http://topic.csdn.net/u/20110412/16/0341626d-8576-4dda-b9e4-aab3ff50c980.html关于list处理的帖子

http://blog.csdn.net/haha_mingg/article/details/6338332,总的思路的实现。在此感谢作者的无私奉献

android 初学,愿与大家相互交流。共同进步。

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. python list.sort()根据多个关键字排序的方法实现
  3. Android(安卓)App多个入口的实现方法
  4. Android小项目之--找到本地联络人并向其发邮件(附源码)
  5. Android(安卓)项目导入eclipse中报错但找不到错误地方的解决方法
  6. Android拍照实现方式概述
  7. Android实现OCR扫描识别数字图片之图片扫描识别
  8. Android(安卓)UI学习1:控件和基本事件的响应
  9. Android的多媒体框架OpenCore(PacketVideo)介绍

随机推荐

  1. Android(安卓)架构师之路20 响应式编程Rx
  2. Android(安卓)显示Intent和隐式Intent
  3. Android(安卓)设置wifi连接应用开发
  4. Android紧急号码列表修改
  5. Android(安卓)USB Host与HID设备通信
  6. AndroidStudio中使用SVG
  7. android(4) 第一次启动滑动界面
  8. android ListView在数据为空的时候headVi
  9. NDK开发笔记 ✎
  10. Android(安卓)studio gradle配置完整版(转