android 连接远程数据库(转)

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

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

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

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

        2.一个接口

Java代码   收藏代码
  1. public interface ICompany {  
  2.     public List<Company> getCompanyList();  
  3. }  

     3一个实现类

Java代码   收藏代码
  1. public class ICompanyImp implements ICompany {  
  2.     CompanyDAO comdao=new CompanyDAO();  
  3.     //得到所有公司列表  
  4.     public List<Company> getCompanyList() {  
  5.         List<Company> list=new ArrayList<Company>();  
  6.         try {  
  7.             list=comdao.getCompanyList();  
  8.         } catch (SQLException e) {  
  9.             e.printStackTrace();  
  10.             list=null;  
  11.         }  
  12.         return list;  
  13.     }  
  14. }  

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

4 接口+.aegis.xml

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <mappings>  
  3.     <mapping>  
  4.     <!--    
  5.         <method name="getCollectionsRowCount">  
  6.             <parameter index="0" componentType="java.lang.String"/>  
  7.         </method>  
  8.         -->  
  9.         <!-- 返回的类型是Map的话,做法和List一样。但定义的类型,是Map中的Value部分 -->  
  10.         <method name="getCompanyList">   
  11.             <return-type componentType="bean.Company"/>  
  12.         </method>  
  13.     </mapping>  
  14. </mappings>  

 

5.service.xml

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans >  
  3. <service xmlns="http://xfire.codehaus.org/config/1.0"  
  4.        xmlns:s="http://www.springframework.org/schema/beans"  
  5.         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  6.        xsi:schemaLocation="http://www.springframework.org/schema/beans  
  7.         http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  
  8.   
  9.         <name>MyService</name>  
  10.         <serviceClass>main.service.ICompany</serviceClass>  
  11.         <implementationClass>main.service.ICompanyImp</implementationClass>  
  12.   
  13.         <style mce_bogus="1">wrapped</style>  
  14.         <use>literal</use>  
  15.         <scope>application</scope>  
  16.         <namespace>http://android.googlepages.com/</namespace>  
  17.     </service>  
  18. </beans>  

 

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

android 连接远程数据库(转)_第1张图片
 
 
项目结构:


android 连接远程数据库(转)_第2张图片

 


二 android客户端

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

  1 解析类:MyWebServiceHelper

Java代码   收藏代码
  1. public class MyWebServiceHelper {  
  2.   
  3.     // WSDL文档中的命名空间     
  4.     private static final String targetNameSpace = "http://android.googlepages.com/";    
  5.         
  6.     // WSDL文档中的URL     
  7.     private static final String WSDL = "http://192.168.1.144:8080/oilservice/services/MyService";    
  8.     // 需要调用的方法名(获得Myervices中的helloWorld方法)     
  9.         
  10.     //需要调用的方法名(获得Myervices中的login方法)     
  11.     private static final String getCompany="getCompanyList";    
  12.    
  13.         
  14.     public List<Company>  getCompanyList( ) {    
  15.           
  16.         List<Company> list=new ArrayList<Company>();  
  17.           
  18.         SoapObject request =new SoapObject(targetNameSpace,getCompany);  
  19.           
  20.         SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(    
  21.                 SoapEnvelope.VER11);   
  22.           
  23.         envelope.dotNet = false;   
  24.         envelope.setOutputSoapObject(request);   
  25.           
  26.         AndroidHttpTransport  httpTranstation = new AndroidHttpTransport (WSDL);   
  27.   
  28.         try {    
  29.             httpTranstation.call(targetNameSpace+getCompany, envelope);    
  30.                 SoapObject soapObject = (SoapObject) envelope.getResponse();   
  31.                 //如果获取的是个集合,就对它进行下面的操作  
  32.                 if(soapObject.getName()=="anyType") {  
  33.                     //遍历Web Service获得的集合  
  34.                     for(int i=0;i<soapObject.getPropertyCount();i++){  
  35.                         Company m=new Company();  
  36.                          
  37.                         //获取单条的数据  
  38.                         SoapObject soapChilds =(SoapObject)soapObject.getProperty(i);  
  39.                           
  40.                         //对单个的数据进行再次遍历,把它的每行数据读取出来  
  41.                             m.setId(Integer.parseInt(soapChilds.getProperty("id").toString()));  
  42.                             m.setCompany(soapChilds.getProperty("company").toString());  
  43.                               
  44.                           /*   
  45.                            //获取实体类的所有属性 
  46.                             Field[] field = m.getClass().getDeclaredFields();   
  47.                              
  48.                            //遍历所有属性,第一个是序列化的id,serialVersionUID,用不到。 
  49.                             for(int j=0 ; j<field.length ; j++){      
  50.                                //获取属性的名字 
  51.                                 String name = field[j].getName();    
  52.                                 System.out.println(name); 
  53.                                 
  54.                             }*/  
  55.                        // }  
  56.                      
  57.                         list.add(m);  
  58.                     }  
  59.   
  60.             }  
  61.               
  62.           
  63.         } catch (IOException e) {    
  64.             e.printStackTrace();    
  65.         } catch (XmlPullParserException e) {    
  66.             e.printStackTrace();    
  67.         }    
  68.           
  69.         return list;    
  70.     }    
  71. }    

 

2 实现类:

 

Java代码   收藏代码
  1. public class OilActivity extends Activity {  
  2.     /** Called when the activity is first created. */  
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.main);  
  7.           
  8.         Spinner spinner = (Spinner) findViewById(R.id.company);  
  9.           
  10.         ArrayAdapter<String>  adapter = new ArrayAdapter<String>(  
  11.                 this,android.R.layout.simple_spinner_item);  
  12.         adapter.setDropDownViewResource(  
  13.                 android.R.layout.simple_spinner_dropdown_item);  
  14.   
  15.           
  16.        //调用自已写的webService     
  17.         MyWebServiceHelper webServiceHelper=new MyWebServiceHelper();  
  18.       List<Company> compnayList=  webServiceHelper.getCompanyList();  
  19.           
  20.       for(int i=0;i<compnayList.size();i++){  
  21.           adapter.add(compnayList.get(i).getCompany());  
  22.       }  
  23.           
  24.         spinner.setAdapter(adapter);  
  25.   
  26.     }  
  27. }  

 3 两个项目中都用到的bean

Java代码   收藏代码
  1. public class Company implements Serializable{  
  2.   
  3.     private static final long serialVersionUID = 1L;  
  4.       
  5.     private int id;  
  6.     private String company;  
  7.       
  8.     public int getId() {  
  9.         return id;  
  10.     }  
  11.     public void setId(int id) {  
  12.         this.id = id;  
  13.     }  
  14.     public String getCompany() {  
  15.         return company;  
  16.     }  
  17.     public void setCompany(String company) {  
  18.         this.company = company;  
  19.     }  
  20.       
  21. }  

 

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

 



 

3项目结构:

 


android 连接远程数据库(转)_第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 初学,愿与大家相互交流。共同进步。

  • oilservice.rar (672.9 KB)
  • 下载次数: 15
  • oil.rar (173.8 KB)
  • 下载次数: 13
  • 查看图片附件

你可能感兴趣的:(android,数据库,webservice,list,dropdown,encoding)