想实现一个功能即让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 初学,愿与大家相互交流。共同进步。