想實作一個功能即讓android通路遠端資料庫,但是網上很多人都不建議直連。據說問題多多。那麼中間就加個第三者吧。
實作思路:在資料庫和android用戶端添加一個webservice,處理每次用戶端發來的請求。而在android用戶端使用ksoap2解析webservice傳回的資料。
一 webservice 端,我使用序列化的方式實作的。不知道這裡跟xml的實作哪個對手機來說更好。這裡先放下,以後研究。
1.我使用的是xfire。建立一個webservice項目,然後我們開始寫代碼
2.一個接口
Java代碼
- public interface ICompany {
- public List<Company> getCompanyList();
- }
3一個實作類
Java代碼
- 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代碼
- <?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代碼
- <?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
Java代碼
- 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());
- // }
- list.add(m);
- }
- }
- } catch (IOException e) {
- e.printStackTrace();
- } catch (XmlPullParserException e) {
- e.printStackTrace();
- }
- return list;
- }
- }
2 實作類:
Java代碼
- public class OilActivity extends Activity {
- @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
Java代碼
- 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 初學,願與大家互相交流。共同進步。
- oilservice.rar (672.9 KB)
- 下載下傳次數: 15
- oil.rar (173.8 KB)
- 下載下傳次數: 13
- 檢視圖檔附件