為了避免再次被說標題黨,這裡先說明些事情:
第一,android沒法直接連接SQLServer,起碼我沒有發現方法,想想看,sqlserver安裝之後有多大,android程序是跑在手機上的,想讓程序直接訪問sqlserver,那手機要多大的內存?
第二,本文是通過一個“橋梁”——webservice來間接訪問SQLServer的,當然還有其他方法,感興趣的同學可以自行百度。
如果理解了上面兩點,好了咱們繼續。
教程會拿一個具體的例子來講,一步一步來,也許細節上還可以繼續加工,但大致的流程就是這樣的。
本教程有五個部分:
項目說明開發環境部署數據庫設計服務器端程序設計客戶端(android端)程序設計
項目說明
這個項目意在實現一個簡單的android連接Sqlserver的功能。
就做一個簡單的庫存管理功能,包括對倉庫內現有貨物的查看、貨物信息的增加&刪除。
開發環境的部署
今天主要講解第一個部分,開發環境的部署.
操作系統:Windows764bit旗艦版
當然這個是什麼基本無所謂,只是我是在這上面開發的,不過家庭普通版的貌似不能配置IIS,就是咱們後面要使用的一個服務.
android端:eclipse + ADT集成開發環境
相信看到這個教程的基本都知道如何做這些了.如果真的是有哪位同學android開發環境沒有配置好而來看這篇教程,請先移步->www.google.com
服務器端:VisualStudio 2010旗艦版
這個是用來寫website/webservice的,開發語言使用C# (即.net)
數據庫:SQLServer2008 R2
其實這個是什麼版本也無所謂吧,教程使用的都是比較基本的東西,所以版本的差異基本可以忽略。
IIS 7.5:正確配置並開啟IIS服務
如果想將website/webservice發布出去就要開啟這個服務。但是如果僅僅是在本地進行測試就不需要配置,直接在VS中運行就可以。
其實我在開發的時候也只是配置IIS的時候遇到了一些問題,這裡給出IIS的配置方法.
http://wenku.baidu.com/view/95cf9fd9ad51f01dc281f1af.html這篇文庫給的還是很詳細的,我當初就是照著這個配置的。
數據庫設計
數據庫名稱:StockManage
表設計
表名稱:C
表說明:
列名
中文名稱
數據型態
必填
說明
Cno
貨物編號
Int
V
主鍵,自增
Cname
貨物名稱
String
Cnum
貨物數量
Int
下圖是設計表的時候的截圖。
向表中輸入內容
吐槽一下:為什麼這裡貓、狗、電話都有,甚至還有Surface?!這只能說當時LZ在想這些……
服務器端程序設計(Webservice)
其實服務端可以寫成webservice也可以寫成website,前者只是提供一種服務,而後者是可以提供用戶界面等具體的頁面,後者也就是咱們平時所說的“網站”。
兩者的區別:
Web Service 只提供程序和接口,不提供用戶界面Web Site 提供程序和接口,也提供用戶界面(網頁)
由於咱們只是需要一個中介來訪問sqlserver,所以寫成webservice足夠了。
目標:寫一個Website訪問Sqlserver,獲取數據並轉換成xml格式,然後傳遞給android客戶端。
1.新建一個Webservice工程
2.視圖 ->其它窗口 -> 服務器資源管理器
3.右鍵數據連接 -> 添加連接
4.選擇Microsoft Sqlserver
5.如下圖所示選擇(可以點擊測試連接來檢測連接是否成功,然後點擊確定)
6.數據庫的查看和編輯也可以在VS中進行了
7.先查看一下數據庫屬性並記錄下連接屬性
8.新建一個類DBOperation,代碼如下:
[csharp]view plaincopy
print?
- usingSystem;
- usingSystem.Data;
- usingSystem.Configuration;
- usingSystem.Linq;
- usingSystem.Web;
- usingSystem.Web.Security;
- usingSystem.Web.UI;
- usingSystem.Web.UI.HtmlControls;
- usingSystem.Web.UI.WebControls;
- usingSystem.Web.UI.WebControls.WebParts;
- usingSystem.Xml.Linq;
- usingSystem.Data.SqlClient;
- usingSystem.Text.RegularExpressions;
- usingSystem.Collections;
- usingSystem.Collections.Generic;
-
- namespaceStockManageWebservice
- {
- ///
- ///一個操作數據庫的類,所有對SQLServer的操作都寫在這個類中,使用的時候實例化一個然後直接調用就可以
- ///
- publicclassDBOperation:IDisposable
- {
- publicstaticSqlConnectionsqlCon;//用於連接數據庫
-
- //將下面的引號之間的內容換成上面記錄下的屬性中的連接字符串
- privateStringConServerStr=@"DataSource=BOTTLE-PC;InitialCatalog=StockManage;IntegratedSecurity=True";
-
- //默認構造函數
- publicDBOperation()
- {
- if(sqlCon==null)
- {
- sqlCon=newSqlConnection();
- sqlCon.ConnectionString=ConServerStr;
- sqlCon.Open();
- }
- }
-
- //關閉/銷毀函數,相當於Close()
- publicvoidDispose()
- {
- if(sqlCon!=null)
- {
- sqlCon.Close();
- sqlCon=null;
- }
- }
-
- ///
- ///獲取所有貨物的信息
- ///
- ///所有貨物信息
- publicListselectAllCargoInfor()
- {
- Listlist=newList();
-
- try
- {
- stringsql="select*fromC";
- SqlCommandcmd=newSqlCommand(sql,sqlCon);
- SqlDataReaderreader=cmd.ExecuteReader();
-
- while(reader.Read())
- {
- //將結果集信息添加到返回向量中
- list.Add(reader[0].ToString());
- list.Add(reader[1].ToString());
- list.Add(reader[2].ToString());
-
- }
-
- reader.Close();
- cmd.Dispose();
-
- }
- catch(Exception)
- {
-
- }
- returnlist;
- }
-
- ///
- ///增加一條貨物信息
- ///
- ///貨物名稱
- ///貨物數量
- publicboolinsertCargoInfo(stringCname,intCnum)
- {
- try
- {
- stringsql="insertintoC(Cname,Cnum)values('"+Cname+"',"+Cnum+")";
- SqlCommandcmd=newSqlCommand(sql,sqlCon);
- cmd.ExecuteNonQuery();
- cmd.Dispose();
-
- returntrue;
- }
- catch(Exception)
- {
- returnfalse;
- }
- }
-
- ///
- ///刪除一條貨物信息
- ///
- ///貨物編號
- publicbooldeleteCargoInfo(stringCno)
- {
- try
- {
- stringsql="deletefromCwhereCno="+Cno;
- SqlCommandcmd=newSqlCommand(sql,sqlCon);
- cmd.ExecuteNonQuery();
- cmd.Dispose();
-
- returntrue;
- }
- catch(Exception)
- {
- returnfalse;
- }
- }
- }
- }
9. 修改Service1.asmx.cs代碼如下:
- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.Linq;
- usingSystem.Web;
- usingSystem.Web.Services;
-
- namespaceStockManageWebservice
- {
- ///
- ///Service1的摘要說明
- ///
- [WebService(Namespace="http://tempuri.org/")]
- [WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]
- [System.ComponentModel.ToolboxItem(false)]
- //若要允許使用ASP.NETAJAX從腳本中調用此Web服務,請取消對下行的注釋。
- //[System.Web.Script.Services.ScriptService]
- publicclassService1:System.Web.Services.WebService
- {
- DBOperationdbOperation=newDBOperation();
-
- [WebMethod]
- publicstringHelloWorld()
- {
- return"HelloWorld";
- }
-
- [WebMethod(Description="獲取所有貨物的信息")]
- publicstring[]selectAllCargoInfor()
- {
- returndbOperation.selectAllCargoInfor().ToArray();
- }
-
- [WebMethod(Description="增加一條貨物信息")]
- publicboolinsertCargoInfo(stringCname,intCnum)
- {
- returndbOperation.insertCargoInfo(Cname,Cnum);
- }
-
- [WebMethod(Description="刪除一條貨物信息")]
- publicbooldeleteCargoInfo(stringCno)
- {
- returndbOperation.deleteCargoInfo(Cno);
- }
- }
- }
10.運行程序(F5),會自動打開一個浏覽器,可以看到如下畫面:
11.選擇相應的功能並傳遞參數可以實現調試從浏覽器中調試程序:
下圖選擇的是增加一條貨物信息
12. 程序執行的結果:
13.另,記住這裡的端口名,後面android的程序中添入的端口號就是這個:
客戶端(android端)程序設計
程序代碼:
1.MainActivity
[java]view plaincopy
print?
- packagecom.bottle.stockmanage;
-
- importjava.util.ArrayList;
- importjava.util.HashMap;
- importjava.util.List;
-
- importandroid.app.Activity;
- importandroid.app.Dialog;
- importandroid.os.Bundle;
- importandroid.view.Gravity;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.view.Window;
- importandroid.view.WindowManager;
- importandroid.widget.Button;
- importandroid.widget.EditText;
- importandroid.widget.ListView;
- importandroid.widget.SimpleAdapter;
- importandroid.widget.Toast;
-
- publicclassMainActivityextendsActivity{
-
- privateButtonbtn1;
- privateButtonbtn2;
- privateButtonbtn3;
- privateListViewlistView;
- privateSimpleAdapteradapter;
- privateDBUtildbUtil;
-
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
-
- btn1=(Button)findViewById(R.id.btn_all);
- btn2=(Button)findViewById(R.id.btn_add);
- btn3=(Button)findViewById(R.id.btn_delete);
- listView=(ListView)findViewById(R.id.listView);
- dbUtil=newDBUtil();
-
- btn1.setOnClickListener(newOnClickListener(){
-
- @Override
- publicvoidonClick(Viewv){
- hideButton(true);
- setListView();
- }
- });
-
- btn2.setOnClickListener(newOnClickListener(){
-
- @Override
- publicvoidonClick(Viewv){
- hideButton(true);
- setAddDialog();
- }
- });
-
- btn3.setOnClickListener(newOnClickListener(){
-
- @Override
- publicvoidonClick(Viewv){
- hideButton(true);
- setDeleteDialog();
- }
- });
- }
-
- /**
- *設置彈出刪除對話框
- */
- privatevoidsetDeleteDialog(){
-
- finalDialogdialog=newDialog(MainActivity.this);
- dialog.setContentView(R.layout.dialog_delete);
- dialog.setTitle("輸入想要刪除的貨物的編號");
- WindowdialogWindow=dialog.getWindow();
- WindowManager.LayoutParamslp=dialogWindow.getAttributes();
- dialogWindow.setGravity(Gravity.CENTER);
- dialogWindow.setAttributes(lp);
-
- finalEditTextcNoEditText=(EditText)dialog.findViewById(R.id.editText1);
- ButtonbtnConfirm=(Button)dialog.findViewById(R.id.button1);
- ButtonbtnCancel=(Button)dialog.findViewById(R.id.button2);
-
- btnConfirm.setOnClickListener(newOnClickListener(){
-
- @Override
- publicvoidonClick(Viewv){
- dbUtil.deleteCargoInfo(cNoEditText.getText().toString());
- dialog.dismiss();
- hideButton(false);
- Toast.makeText(MainActivity.this,"成功刪除數據",Toast.LENGTH_SHORT).show();
- }
- });
-
- btnCancel.setOnClickListener(newOnClickListener(){
-
- @Override
- publicvoidonClick(Viewv){
- dialog.dismiss();
- hideButton(false);
- }
- });
-
- dialog.show();
- }
-
- /**
- *設置彈出添加對話框
- */
- privatevoidsetAddDialog(){
-
- finalDialogdialog=newDialog(MainActivity.this);
- dialog.setContentView(R.layout.dialog_add);
- dialog.setTitle("輸入添加的貨物的信息");
- WindowdialogWindow=dialog.getWindow();
- WindowManager.LayoutParamslp=dialogWindow.getAttributes();
- dialogWindow.setGravity(Gravity.CENTER);
- dialogWindow.setAttributes(lp);
-
- finalEditTextcNameEditText=(EditText)dialog.findViewById(R.id.editText1);
- finalEditTextcNumEditText=(EditText)dialog.findViewById(R.id.editText2);
- ButtonbtnConfirm=(Button)dialog.findViewById(R.id.button1);
- ButtonbtnCancel=(Button)dialog.findViewById(R.id.button2);
-
- btnConfirm.setOnClickListener(newOnClickListener(){
-
- @Override
- publicvoidonClick(Viewv){
-
- dbUtil.insertCargoInfo(cNameEditText.getText().toString(),cNumEditText.getText().toString());
- dialog.dismiss();
- hideButton(false);
- Toast.makeText(MainActivity.this,"成功添加數據",Toast.LENGTH_SHORT).show();
- }
- });
-
- btnCancel.setOnClickListener(newOnClickListener(){
-
- @Override
- publicvoidonClick(Viewv){
- dialog.dismiss();
- hideButton(false);
- }
- });
- dialog.show();
- }
-
- /**
- *設置listView
- */
- privatevoidsetListView(){
-
- listView.setVisibility(View.VISIBLE);
-
- List>list=newArrayList>();
-
- list=dbUtil.getAllInfo();
-
- adapter=newSimpleAdapter(
- MainActivity.this,
- list,
- R.layout.adapter_item,
- newString[]{"Cno","Cname","Cnum"},
- newint[]{R.id.txt_Cno,R.id.txt_Cname,R.id.txt_Cnum});
-
- listView.setAdapter(adapter);
-
- }
-
- /**
- *設置button的可見性
- */
- privatevoidhideButton(booleanresult){
- if(result){
- btn1.setVisibility(View.GONE);
- btn2.setVisibility(View.GONE);
- btn3.setVisibility(View.GONE);
- }else{
- btn1.setVisibility(View.VISIBLE);
- btn2.setVisibility(View.VISIBLE);
- btn3.setVisibility(View.VISIBLE);
- }
-
- }
-
- /**
- *返回按鈕的重寫
- */
- @Override
- publicvoidonBackPressed()
- {
- if(listView.getVisibility()==View.VISIBLE){
- listView.setVisibility(View.GONE);
- hideButton(false);
- }else{
- MainActivity.this.finish();
- }
- }
- }
-
2.HttpConnSoap
(改類已經過時,更多請參照
http://blog.csdn.net/zhyl8157121/article/details/8709048)
[java]view plaincopy
print?
- packagecom.bottle.stockmanage;
-
- importjava.io.IOException;
- importjava.io.InputStream;
- importjava.io.OutputStream;
- importjava.net.HttpURLConnection;
- importjava.net.URL;
- importjava.util.ArrayList;
-
- publicclassHttpConnSoap{
- publicArrayListGetWebServre(StringmethodName,ArrayListParameters,ArrayListParValues){
- ArrayListValues=newArrayList();
-
- //ServerUrl是指webservice的url
- //10.0.2.2是讓android模擬器訪問本地(PC)服務器,不能寫成127.0.0.1
- //11125是指端口號,即掛載到IIS上的時候開啟的端口
- //Service1.asmx是指提供服務的頁面
- StringServerUrl="http://10.0.2.2:11125/Service1.asmx";
-
- //StringsoapAction="http://tempuri.org/LongUserId1";
- StringsoapAction="http://tempuri.org/"+methodName;
- //Stringdata="";
- Stringsoap=""
- +"";
- Stringtps,vps,ts;
- StringmreakString="";
-
- mreakString="<"+methodName+"xmlns=\"http://tempuri.org/\">";
- for(inti=0;i tps=Parameters.get(i).toString();
- //設置該方法的參數為.netwebService中的參數名稱
- vps=ParValues.get(i).toString();
- ts="<"+tps+">"+vps+"";
- mreakString=mreakString+ts;
- }
- mreakString=mreakString+"";
- /*
- +"string11661"
- +"string111"
- +""
- */
- Stringsoap2="";
- StringrequestData=soap+mreakString+soap2;
- //System.out.println(requestData);
-
- try{
- URLurl=newURL(ServerUrl);
- HttpURLConnectioncon=(HttpURLConnection)url.openConnection();
- byte[]bytes=requestData.getBytes("utf-8");
- con.setDoInput(true);
- con.setDoOutput(true);
- con.setUseCaches(false);
- con.setConnectTimeout(6000);//設置超時時間
- con.setRequestMethod("POST");
- con.setRequestProperty("Content-Type","text/xml;charset=utf-8");
- con.setRequestProperty("SOAPAction",soapAction);
- con.setRequestProperty("Content-Length",""+bytes.length);
- OutputStreamoutStream=con.getOutputStream();
- outStream.write(bytes);
- outStream.flush();
- outStream.close();
- InputStreaminStream=con.getInputStream();
-
- //data=parser(inStream);
- //System.out.print("11");
- Values=inputStreamtovaluelist(inStream,methodName);
- //System.out.println(Values.size());
- returnValues;
-
- }catch(Exceptione){
- System.out.print("2221");
- returnnull;
- }
- }
-
- publicArrayListinputStreamtovaluelist(InputStreamin,StringMonthsName)throwsIOException{
- StringBufferout=newStringBuffer();
- Strings1="";
- byte[]b=newbyte[4096];
- ArrayListValues=newArrayList();
- Values.clear();
-
- for(intn;(n=in.read(b))!=-1;){
- s1=newString(b,0,n);
- out.append(s1);
- }
-
- System.out.println(out);
- String[]s13=s1.split("><");
- StringifString=MonthsName+"Result";
- StringTS="";
- Stringvs="";
-
- BooleangetValueBoolean=false;
- for(inti=0;i TS=s13[i];
- System.out.println(TS);
- intj,k,l;
- j=TS.indexOf(ifString);
- k=TS.lastIndexOf(ifString);
-
- if(j>=0){
- System.out.println(j);
- if(getValueBoolean==false){
- getValueBoolean=true;
- }else{
-
- }
-
- if((j>=0)&&(k>j)){
- System.out.println("FFF"+TS.lastIndexOf("/"+ifString));
- //System.out.println(TS);
- l=ifString.length()+1;
- vs=TS.substring(j+l,k-2);
- //System.out.println("fff"+vs);
- Values.add(vs);
- System.out.println("退出"+vs);
- getValueBoolean=false;
- returnValues;
- }
-
- }
- if(TS.lastIndexOf("/"+ifString)>=0){
- getValueBoolean=false;
- returnValues;
- }
- if((getValueBoolean)&&(TS.lastIndexOf("/"+ifString)<0)&&(j<0)){
- k=TS.length();
- //System.out.println(TS);
- vs=TS.substring(7,k-8);
- //System.out.println("f"+vs);
- Values.add(vs);
- }
-
- }
-
- returnValues;
- }
-
- }
3.DBUtil
- packagecom.bottle.stockmanage;
-
- importjava.sql.Connection;
- importjava.util.ArrayList;
- importjava.util.HashMap;
- importjava.util.List;
-
- publicclassDBUtil{
- privateArrayListarrayList=newArrayList();
- privateArrayListbrrayList=newArrayList();
- privateArrayListcrrayList=newArrayList();
- privateHttpConnSoapSoap=newHttpConnSoap();
-
- publicstaticConnectiongetConnection(){
- Connectioncon=null;
- try{
- //Class.forName("org.gjt.mm.mysql.Driver");
- //con=DriverManager.getConnection("jdbc:mysql://192.168.0.106:3306/test?useUnicode=true&characterEncoding=UTF-8","root","initial");
- }catch(Exceptione){
- //e.printStackTrace();
- }
- returncon;
- }
-
- /**
- *獲取所有貨物的信息
- *
- *@return
- */
- publicList>getAllInfo(){
- List>list=newArrayList>();
-
- arrayList.clear();
- brrayList.clear();
- crrayList.clear();
-
- crrayList=Soap.GetWebServre("selectAllCargoInfor",arrayList,brrayList);
-
- HashMaptempHash=newHashMap();
- tempHash.put("Cno","Cno");
- tempHash.put("Cname","Cname");
- tempHash.put("Cnum","Cnum");
- list.add(tempHash);
-
- for(intj=0;j HashMaphashMap=newHashMap();
- hashMap.put("Cno",crrayList.get(j));
- hashMap.put("Cname",crrayList.get(j+1));
- hashMap.put("Cnum",crrayList.get(j+2));
- list.add(hashMap);
- }
-
- returnlist;
- }
-
- /**
- *增加一條貨物信息
- *
- *@return
- */
- publicvoidinsertCargoInfo(StringCname,StringCnum){
-
- arrayList.clear();
- brrayList.clear();
-
- arrayList.add("Cname");
- arrayList.add("Cnum");
- brrayList.add(Cname);
- brrayList.add(Cnum);
-
- Soap.GetWebServre("insertCargoInfo",arrayList,brrayList);
- }
-
- /**
- *刪除一條貨物信息
- *
- *@return
- */
- publicvoiddeleteCargoInfo(StringCno){
-
- arrayList.clear();
- brrayList.clear();
-
- arrayList.add("Cno");
- brrayList.add(Cno);
-
- Soap.GetWebServre("deleteCargoInfo",arrayList,brrayList);
- }
- }
4.activity_main.xml
-
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
-
- android:id="@+id/listView"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:visibility="gone">
-
-
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_above="@+id/btn_add"
- android:layout_alignLeft="@+id/btn_add"
- android:layout_marginBottom="10dip"
- android:text="@string/btn1"/>
-
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerHorizontal="true"
- android:layout_centerVertical="true"
- android:text="@string/btn2"/>
-
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignLeft="@+id/btn_add"
- android:layout_below="@+id/btn_add"
- android:layout_marginTop="10dip"
- android:text="@string/btn3"/>
-
-
5.adapter_item.xml
-
-
- android:layout_height="wrap_content"
- android:descendantFocusability="blocksDescendants"
- android:gravity="center">
-
- android:id="@+id/classroom_detail_item_tableRow"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:gravity="center">
-
- android:id="@+id/txt_Cno"
- android:layout_width="80dp"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:height="40dp"
- android:textSize="14sp">
-
-
- android:id="@+id/txt_Cname"
- android:layout_width="80dp"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:height="40dp"
- android:textSize="14sp">
-
-
- android:id="@+id/txt_Cnum"
- android:layout_width="80dp"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:height="40dp"
- android:textSize="14sp">
-
-
-
-
-
6.dialog_add.xml
-
-
- android:layout_height="fill_parent"
- android:orientation="vertical">
-
- android:id="@+id/editText1"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:ems="10"
- android:hint="@string/add_hint1">
-
-
-
- android:id="@+id/editText2"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:ems="10"
- android:hint="@string/add_hint2"
- android:inputType="number"/>
-
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
-
- android:layout_width="100dip"
- android:layout_height="wrap_content"
- android:layout_marginLeft="20dip"
- android:text="@string/confirm"/>
-
- android:layout_width="100dip"
- android:layout_height="wrap_content"
- android:layout_marginLeft="40dip"
- android:text="@string/cancel"/>
-
-
-
7.dialog_delete.xml
-
-
- android:layout_height="fill_parent"
- android:orientation="vertical">
-
- android:id="@+id/editText1"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:ems="10"
- android:hint="@string/delete_hint">
-
-
-
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
-
- android:layout_width="100dip"
- android:layout_height="wrap_content"
- android:layout_marginLeft="20dip"
- android:text="@string/confirm"/>
-
- android:layout_width="100dip"
- android:layout_height="wrap_content"
- android:layout_marginLeft="40dip"
- android:text="@string/cancel"/>
-
-
-
8.strings.xml
-
- StockManagement
- Settings
- MainActivity
- 查看所有貨物信息
- 增加一條貨物信息
- 刪除一條貨物信息
- 輸入添加的貨物的名稱
- 輸入貨物的數量
- 確定
- 取消
- 輸入刪除的貨物的編號
-
-
9.Manifest.xml
-
- android:versionCode="1"
- android:versionName="1.0">
-
- android:minSdkVersion="7"
- android:targetSdkVersion="15"/>
-
-
-
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@android:style/Theme.NoTitleBar">
- android:name=".MainActivity"
- android:label="@string/title_activity_main"
- android:screenOrientation="portrait">
-
-
-
-
-
-
運行程序的效果如下圖所示:
再說一下IIS,如果只是在本地進行測試等操作,是不需要使用到IIS的,但是如果想發布出去,就要配置一下IIS。
好啦,基本就是這樣了。程序不是完善的,但大概的思路就是這樣,用
之前收到過一些同學發來的郵件,問題大概以下幾種,這裡統一答復一下吧,希望給有問題的同學一個參考。
0.Webservice無法正確執行(這個沒什麼說的,webservice有問題)
1.Webservice用本地的電腦可以訪問,但是在手機浏覽器中就無法得到正確的結果(Webservice配置問題,或者IIS配置問題)
2.Webservice用本地的電腦和手機浏覽器都可以正確執行,但是程序一運行就崩潰
2.1 可能情況1 - 我的程序是用Android2.1寫的,Android2.3以後有一個StrictMode的問題,如果有同學是用2.3以上版本做的,可能是這個問題,具體可以搜索一下StrictMode,然後修改一下程序即可,我在這裡就不獻丑了。
2.2 可能情況2 - 調試的時候是用的是模擬器,IP地址當時填寫的是10.0.2.2,這個地址是PC相對於模擬器的IP地址,放到真機中就不行了,真機運行程序中要填寫PC的IP地址(可以將手機和PC連接在同一個局域網中做測試,也可以將程序發布到服務器上,Android程序中填寫服務器的IP地址和端口號)。
3.用模擬器調試怎麼都可以,但放到真機上就不行。
3.1 可能情況1 - 模擬器的版本是2.3以下的,程序運行正常,可是真機是2.3以上的,解決方法參考2.1。
3.2 可能情況2 -放到真機運行的時候沒改程序的url,IP地址錯誤,解決方法參考2.2。
4.SQL語句錯誤、按鈕監聽錯誤等問題大家細心查查就行了。