android 连接远程数据库


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

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

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

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

        2.一个接口

public interface ICompany {
	public List getCompanyList();
}

     3一个实现类

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

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

4 接口+.aegis.xml



    
    
        
         
            
        
    

 

5.service.xml





		MyService
		main.service.ICompany
		main.service.ICompanyImp

		
		literal
		application
		http://android.googlepages.com/
	

 

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

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


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

 


二 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  getCompanyList( ) {  
    	
    	List list=new ArrayList();
        
        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

 

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  adapter = new ArrayAdapter(
                this,android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(
                android.R.layout.simple_spinner_dropdown_item);

        
       //调用自已写的webService   
        MyWebServiceHelper webServiceHelper=new MyWebServiceHelper();
      List compnayList=  webServiceHelper.getCompanyList();
        
      for(int i=0;i

 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项目结构:

 


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 初学,愿与大家相互交流。共同进步。

你可能感兴趣的:(Android)