zoukankan      html  css  js  c++  java
  • Android通过webservice连接SQLServer 详细教程(数据库+服务器+客户端)

    参考路径:http://blog.csdn.net/zhyl8157121/article/details/8169172

    Android通过webservice连接SQLServer 详细教程(数据库+服务器+客户端)

    原创 2012年11月10日 15:09:39

            本文为原创,如果转载请注明出处 http://blog.csdn.net/zhyl8157121/article/details/8169172

    其实之前发过一篇这样的博文http://blog.csdn.net/zhyl8157121/article/details/7709552,但那个只是简单记录了一些自己的想法,并没有想作为教程来看,后来由于一些朋友想要源代码,就附上了下载地址,但并没有做什么讲解,从现在开始,准备做一份详细的Android如何连接Sqlserver的教程.由于本人才疏学浅,如果有什么不对的地方欢迎大家批评指正.

            为了避免再次被说标题党,这里先说明些事情:

            第一,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 plain copy
     
    1. using System;  
    2. using System.Data;  
    3. using System.Configuration;  
    4. using System.Linq;  
    5. using System.Web;  
    6. using System.Web.Security;  
    7. using System.Web.UI;  
    8. using System.Web.UI.HtmlControls;  
    9. using System.Web.UI.WebControls;  
    10. using System.Web.UI.WebControls.WebParts;  
    11. using System.Xml.Linq;  
    12. using System.Data.SqlClient;  
    13. using System.Text.RegularExpressions;  
    14. using System.Collections;  
    15. using System.Collections.Generic;  
    16.   
    17. namespace StockManageWebservice  
    18. {  
    19.     /// <summary>  
    20.     /// 一个操作数据库的类,所有对SQLServer的操作都写在这个类中,使用的时候实例化一个然后直接调用就可以  
    21.     /// </summary>  
    22.     public class DBOperation:IDisposable  
    23.     {  
    24.         public static SqlConnection sqlCon;  //用于连接数据库  
    25.   
    26.         //将下面的引号之间的内容换成上面记录下的属性中的连接字符串  
    27.         private String ConServerStr = @"Data Source=BOTTLE-PC;Initial Catalog=StockManage;Integrated Security=True";  
    28.           
    29.         //默认构造函数  
    30.         public DBOperation()  
    31.         {  
    32.             if (sqlCon == null)  
    33.             {  
    34.                 sqlCon = new SqlConnection();  
    35.                 sqlCon.ConnectionString = ConServerStr;  
    36.                 sqlCon.Open();  
    37.             }  
    38.         }  
    39.            
    40.         //关闭/销毁函数,相当于Close()  
    41.         public void Dispose()  
    42.         {  
    43.             if (sqlCon != null)  
    44.             {  
    45.                 sqlCon.Close();  
    46.                 sqlCon = null;  
    47.             }  
    48.         }  
    49.           
    50.         /// <summary>  
    51.         /// 获取所有货物的信息  
    52.         /// </summary>  
    53.         /// <returns>所有货物信息</returns>  
    54.         public List<string> selectAllCargoInfor()  
    55.         {  
    56.             List<string> list = new List<string>();  
    57.   
    58.             try  
    59.             {  
    60.                 string sql = "select * from C";  
    61.                 SqlCommand cmd = new SqlCommand(sql,sqlCon);  
    62.                 SqlDataReader reader = cmd.ExecuteReader();  
    63.   
    64.                 while (reader.Read())  
    65.                 {  
    66.                     //将结果集信息添加到返回向量中  
    67.                     list.Add(reader[0].ToString());  
    68.                     list.Add(reader[1].ToString());  
    69.                     list.Add(reader[2].ToString());  
    70.   
    71.                 }  
    72.   
    73.                 reader.Close();  
    74.                 cmd.Dispose();  
    75.   
    76.             }  
    77.             catch(Exception)  
    78.             {  
    79.   
    80.             }  
    81.             return list;  
    82.         }  
    83.   
    84.         /// <summary>  
    85.         /// 增加一条货物信息  
    86.         /// </summary>  
    87.         /// <param name="Cname">货物名称</param>  
    88.         /// <param name="Cnum">货物数量</param>  
    89.         public bool insertCargoInfo(string Cname, int Cnum)  
    90.         {  
    91.             try  
    92.             {  
    93.                 string sql = "insert into C (Cname,Cnum) values ('" + Cname + "'," + Cnum + ")";  
    94.                 SqlCommand cmd = new SqlCommand(sql, sqlCon);  
    95.                 cmd.ExecuteNonQuery();  
    96.                 cmd.Dispose();  
    97.   
    98.                 return true;  
    99.             }  
    100.             catch (Exception)  
    101.             {  
    102.                 return false;  
    103.             }  
    104.         }  
    105.   
    106.         /// <summary>  
    107.         /// 删除一条货物信息  
    108.         /// </summary>  
    109.         /// <param name="Cno">货物编号</param>  
    110.         public bool deleteCargoInfo(string Cno)  
    111.         {  
    112.             try  
    113.             {  
    114.                 string sql = "delete from C where Cno=" + Cno;  
    115.                 SqlCommand cmd = new SqlCommand(sql, sqlCon);  
    116.                 cmd.ExecuteNonQuery();  
    117.                 cmd.Dispose();  
    118.   
    119.                 return true;  
    120.             }  
    121.             catch (Exception)  
    122.             {  
    123.                 return false;  
    124.             }  
    125.         }  
    126.     }  
    127. }  

    9.      修改Service1.asmx.cs代码如下:
    [csharp] view plain copy
     
    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.Linq;  
    4. using System.Web;  
    5. using System.Web.Services;  
    6.   
    7. namespace StockManageWebservice  
    8. {  
    9.     /// <summary>  
    10.     /// Service1 的摘要说明  
    11.     /// </summary>  
    12.     [WebService(Namespace = "http://tempuri.org/")]  
    13.     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]  
    14.     [System.ComponentModel.ToolboxItem(false)]  
    15.     // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。  
    16.     // [System.Web.Script.Services.ScriptService]  
    17.     public class Service1 : System.Web.Services.WebService  
    18.     {  
    19.         DBOperation dbOperation = new DBOperation();  
    20.   
    21.         [WebMethod]  
    22.         public string HelloWorld()  
    23.         {  
    24.             return "Hello World";  
    25.         }  
    26.   
    27.         [WebMethod(Description = "获取所有货物的信息")]  
    28.         public string[] selectAllCargoInfor()  
    29.         {  
    30.             return dbOperation.selectAllCargoInfor().ToArray();  
    31.         }  
    32.   
    33.         [WebMethod(Description = "增加一条货物信息")]  
    34.         public bool insertCargoInfo(string Cname, int Cnum)  
    35.         {  
    36.             return dbOperation.insertCargoInfo(Cname, Cnum);  
    37.         }  
    38.   
    39.         [WebMethod(Description = "删除一条货物信息")]  
    40.         public bool deleteCargoInfo(string Cno)  
    41.         {  
    42.             return dbOperation.deleteCargoInfo(Cno);  
    43.         }  
    44.     }  
    45. }  


    10.      运行程序(F5),会自动打开一个浏览器,可以看到如下画面:

    11.  选择相应的功能并传递参数可以实现调试从浏览器中调试程序:

    下图选择的是增加一条货物信息

    12.  程序执行的结果:

    13.另,记住这里的端口名,后面android的程序中添入的端口号就是这个:

    客户端(android端)程序设计

    程序代码:

    1.MainActivity

    [java] view plain copy
     
    1. package com.bottle.stockmanage;  
    2.   
    3. import java.util.ArrayList;  
    4. import java.util.HashMap;  
    5. import java.util.List;  
    6.   
    7. import android.app.Activity;  
    8. import android.app.Dialog;  
    9. import android.os.Bundle;  
    10. import android.view.Gravity;  
    11. import android.view.View;  
    12. import android.view.View.OnClickListener;  
    13. import android.view.Window;  
    14. import android.view.WindowManager;  
    15. import android.widget.Button;  
    16. import android.widget.EditText;  
    17. import android.widget.ListView;  
    18. import android.widget.SimpleAdapter;  
    19. import android.widget.Toast;  
    20.   
    21. public class MainActivity extends Activity{  
    22.   
    23.     private Button btn1;  
    24.     private Button btn2;  
    25.     private Button btn3;  
    26.     private ListView listView;  
    27.     private SimpleAdapter adapter;  
    28.     private DBUtil dbUtil;  
    29.   
    30.     @Override  
    31.     public void onCreate(Bundle savedInstanceState) {  
    32.         super.onCreate(savedInstanceState);  
    33.         setContentView(R.layout.activity_main);  
    34.   
    35.         btn1 = (Button) findViewById(R.id.btn_all);  
    36.         btn2 = (Button) findViewById(R.id.btn_add);  
    37.         btn3 = (Button) findViewById(R.id.btn_delete);  
    38.         listView = (ListView) findViewById(R.id.listView);  
    39.         dbUtil = new DBUtil();  
    40.           
    41.         btn1.setOnClickListener(new OnClickListener() {  
    42.               
    43.             @Override  
    44.             public void onClick(View v) {  
    45.                 hideButton(true);  
    46.                 setListView();  
    47.             }  
    48.         });  
    49.   
    50.         btn2.setOnClickListener(new OnClickListener() {  
    51.               
    52.             @Override  
    53.             public void onClick(View v) {  
    54.                 hideButton(true);  
    55.                 setAddDialog();  
    56.             }  
    57.         });  
    58.   
    59.         btn3.setOnClickListener(new OnClickListener() {  
    60.               
    61.             @Override  
    62.             public void onClick(View v) {  
    63.                 hideButton(true);  
    64.                 setDeleteDialog();  
    65.             }  
    66.         });  
    67.     }  
    68.   
    69.     /** 
    70.      * 设置弹出删除对话框 
    71.      */  
    72.     private void setDeleteDialog() {  
    73.           
    74.         final Dialog dialog = new Dialog(MainActivity.this);  
    75.         dialog.setContentView(R.layout.dialog_delete);  
    76.         dialog.setTitle("输入想要删除的货物的编号");  
    77.         Window dialogWindow = dialog.getWindow();  
    78.         WindowManager.LayoutParams lp = dialogWindow.getAttributes();  
    79.         dialogWindow.setGravity(Gravity.CENTER);  
    80.         dialogWindow.setAttributes(lp);  
    81.   
    82.         final EditText cNoEditText = (EditText) dialog.findViewById(R.id.editText1);  
    83.         Button btnConfirm = (Button) dialog.findViewById(R.id.button1);  
    84.         Button btnCancel = (Button) dialog.findViewById(R.id.button2);  
    85.   
    86.         btnConfirm.setOnClickListener(new OnClickListener() {  
    87.   
    88.             @Override  
    89.             public void onClick(View v) {  
    90.                 dbUtil.deleteCargoInfo(cNoEditText.getText().toString());  
    91.                 dialog.dismiss();  
    92.                 hideButton(false);  
    93.                 Toast.makeText(MainActivity.this, "成功删除数据", Toast.LENGTH_SHORT).show();  
    94.             }  
    95.         });  
    96.   
    97.         btnCancel.setOnClickListener(new OnClickListener() {  
    98.   
    99.             @Override  
    100.             public void onClick(View v) {  
    101.                 dialog.dismiss();  
    102.                 hideButton(false);  
    103.             }  
    104.         });  
    105.           
    106.         dialog.show();  
    107.     }  
    108.   
    109.     /** 
    110.      * 设置弹出添加对话框 
    111.      */  
    112.     private void setAddDialog() {  
    113.   
    114.         final Dialog dialog = new Dialog(MainActivity.this);  
    115.         dialog.setContentView(R.layout.dialog_add);  
    116.         dialog.setTitle("输入添加的货物的信息");  
    117.         Window dialogWindow = dialog.getWindow();  
    118.         WindowManager.LayoutParams lp = dialogWindow.getAttributes();  
    119.         dialogWindow.setGravity(Gravity.CENTER);  
    120.         dialogWindow.setAttributes(lp);  
    121.   
    122.         final EditText cNameEditText = (EditText) dialog.findViewById(R.id.editText1);  
    123.         final EditText cNumEditText = (EditText) dialog.findViewById(R.id.editText2);  
    124.         Button btnConfirm = (Button) dialog.findViewById(R.id.button1);  
    125.         Button btnCancel = (Button) dialog.findViewById(R.id.button2);  
    126.   
    127.         btnConfirm.setOnClickListener(new OnClickListener() {  
    128.   
    129.             @Override  
    130.             public void onClick(View v) {  
    131.                   
    132.                 dbUtil.insertCargoInfo(cNameEditText.getText().toString(), cNumEditText.getText().toString());  
    133.                 dialog.dismiss();  
    134.                 hideButton(false);  
    135.                 Toast.makeText(MainActivity.this, "成功添加数据", Toast.LENGTH_SHORT).show();  
    136.             }  
    137.         });  
    138.   
    139.         btnCancel.setOnClickListener(new OnClickListener() {  
    140.   
    141.             @Override  
    142.             public void onClick(View v) {  
    143.                 dialog.dismiss();  
    144.                 hideButton(false);  
    145.             }  
    146.         });  
    147.         dialog.show();  
    148.     }  
    149.   
    150.     /** 
    151.      * 设置listView 
    152.      */  
    153.     private void setListView() {  
    154.   
    155.         listView.setVisibility(View.VISIBLE);  
    156.   
    157.         List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();  
    158.   
    159.         list = dbUtil.getAllInfo();  
    160.   
    161.         adapter = new SimpleAdapter(  
    162.                 MainActivity.this,   
    163.                 list,   
    164.                 R.layout.adapter_item,   
    165.                 new String[] { "Cno", "Cname", "Cnum" },   
    166.                 new int[] { R.id.txt_Cno, R.id.txt_Cname, R.id.txt_Cnum });  
    167.   
    168.         listView.setAdapter(adapter);  
    169.   
    170.     }  
    171.   
    172.     /** 
    173.      * 设置button的可见性 
    174.      */  
    175.     private void hideButton(boolean result) {  
    176.         if (result) {  
    177.             btn1.setVisibility(View.GONE);  
    178.             btn2.setVisibility(View.GONE);  
    179.             btn3.setVisibility(View.GONE);  
    180.         } else {  
    181.             btn1.setVisibility(View.VISIBLE);  
    182.             btn2.setVisibility(View.VISIBLE);  
    183.             btn3.setVisibility(View.VISIBLE);  
    184.         }  
    185.   
    186.     }  
    187.   
    188.     /** 
    189.      * 返回按钮的重写 
    190.      */  
    191.     @Override  
    192.     public void onBackPressed()  
    193.     {  
    194.         if (listView.getVisibility() == View.VISIBLE) {  
    195.             listView.setVisibility(View.GONE);  
    196.             hideButton(false);  
    197.         }else {  
    198.             MainActivity.this.finish();  
    199.         }  
    200.     }  
    201. }  

    2.HttpConnSoap

    (改类已经过时,更多请参照

    http://blog.csdn.net/zhyl8157121/article/details/8709048)

    [java] view plain copy
     
    1. package com.bottle.stockmanage;  
    2.   
    3. import java.io.IOException;  
    4. import java.io.InputStream;  
    5. import java.io.OutputStream;  
    6. import java.net.HttpURLConnection;  
    7. import java.net.URL;  
    8. import java.util.ArrayList;  
    9.   
    10. public class HttpConnSoap {  
    11.     public ArrayList<String> GetWebServre(String methodName, ArrayList<String> Parameters, ArrayList<String> ParValues) {  
    12.         ArrayList<String> Values = new ArrayList<String>();  
    13.           
    14.         //ServerUrl是指webservice的url  
    15.         //10.0.2.2是让android模拟器访问本地(PC)服务器,不能写成127.0.0.1  
    16.         //11125是指端口号,即挂载到IIS上的时候开启的端口  
    17.         //Service1.asmx是指提供服务的页面  
    18.         String ServerUrl = "http://10.0.2.2:11125/Service1.asmx";  
    19.           
    20.         //String soapAction="http://tempuri.org/LongUserId1";  
    21.         String soapAction = "http://tempuri.org/" + methodName;  
    22.         //String data = "";  
    23.         String soap = "<?xml version="1.0" encoding="utf-8"?>"  
    24.                 + "<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">"  
    25.                 + "<soap:Body />";  
    26.         String tps, vps, ts;  
    27.         String mreakString = "";  
    28.   
    29.         mreakString = "<" + methodName + " xmlns="http://tempuri.org/">";  
    30.         for (int i = 0; i < Parameters.size(); i++) {  
    31.             tps = Parameters.get(i).toString();  
    32.             //设置该方法的参数为.net webService中的参数名称  
    33.             vps = ParValues.get(i).toString();  
    34.             ts = "<" + tps + ">" + vps + "</" + tps + ">";  
    35.             mreakString = mreakString + ts;  
    36.         }  
    37.         mreakString = mreakString + "</" + methodName + ">";  
    38.         /* 
    39.         +"<HelloWorld xmlns="http://tempuri.org/">" 
    40.         +"<x>string11661</x>" 
    41.         +"<SF1>string111</SF1>" 
    42.         + "</HelloWorld>" 
    43.         */  
    44.         String soap2 = "</soap:Envelope>";  
    45.         String requestData = soap + mreakString + soap2;  
    46.         //System.out.println(requestData);  
    47.   
    48.         try {  
    49.             URL url = new URL(ServerUrl);  
    50.             HttpURLConnection con = (HttpURLConnection) url.openConnection();  
    51.             byte[] bytes = requestData.getBytes("utf-8");  
    52.             con.setDoInput(true);  
    53.             con.setDoOutput(true);  
    54.             con.setUseCaches(false);  
    55.             con.setConnectTimeout(6000);// 设置超时时间  
    56.             con.setRequestMethod("POST");  
    57.             con.setRequestProperty("Content-Type", "text/xml;charset=utf-8");  
    58.             con.setRequestProperty("SOAPAction", soapAction);  
    59.             con.setRequestProperty("Content-Length", "" + bytes.length);  
    60.             OutputStream outStream = con.getOutputStream();  
    61.             outStream.write(bytes);  
    62.             outStream.flush();  
    63.             outStream.close();  
    64.             InputStream inStream = con.getInputStream();  
    65.   
    66.             //data=parser(inStream);  
    67.             //System.out.print("11");  
    68.             Values = inputStreamtovaluelist(inStream, methodName);  
    69.             //System.out.println(Values.size());  
    70.             return Values;  
    71.   
    72.         } catch (Exception e) {  
    73.             System.out.print("2221");  
    74.             return null;  
    75.         }  
    76.     }  
    77.   
    78.     public ArrayList<String> inputStreamtovaluelist(InputStream in, String MonthsName) throws IOException {  
    79.         StringBuffer out = new StringBuffer();  
    80.         String s1 = "";  
    81.         byte[] b = new byte[4096];  
    82.         ArrayList<String> Values = new ArrayList<String>();  
    83.         Values.clear();  
    84.   
    85.         for (int n; (n = in.read(b)) != -1;) {  
    86.             s1 = new String(b, 0, n);  
    87.             out.append(s1);  
    88.         }  
    89.   
    90.         System.out.println(out);  
    91.         String[] s13 = s1.split("><");  
    92.         String ifString = MonthsName + "Result";  
    93.         String TS = "";  
    94.         String vs = "";  
    95.   
    96.         Boolean getValueBoolean = false;  
    97.         for (int i = 0; i < s13.length; i++) {  
    98.             TS = s13[i];  
    99.             System.out.println(TS);  
    100.             int j, k, l;  
    101.             j = TS.indexOf(ifString);  
    102.             k = TS.lastIndexOf(ifString);  
    103.   
    104.             if (j >= 0) {  
    105.                 System.out.println(j);  
    106.                 if (getValueBoolean == false) {  
    107.                     getValueBoolean = true;  
    108.                 } else {  
    109.   
    110.                 }  
    111.   
    112.                 if ((j >= 0) && (k > j)) {  
    113.                     System.out.println("FFF" + TS.lastIndexOf("/" + ifString));  
    114.                     //System.out.println(TS);  
    115.                     l = ifString.length() + 1;  
    116.                     vs = TS.substring(j + l, k - 2);  
    117.                     //System.out.println("fff"+vs);  
    118.                     Values.add(vs);  
    119.                     System.out.println("退出" + vs);  
    120.                     getValueBoolean = false;  
    121.                     return Values;  
    122.                 }  
    123.   
    124.             }  
    125.             if (TS.lastIndexOf("/" + ifString) >= 0) {  
    126.                 getValueBoolean = false;  
    127.                 return Values;  
    128.             }  
    129.             if ((getValueBoolean) && (TS.lastIndexOf("/" + ifString) < 0) && (j < 0)) {  
    130.                 k = TS.length();  
    131.                 //System.out.println(TS);  
    132.                 vs = TS.substring(7, k - 8);  
    133.                 //System.out.println("f"+vs);  
    134.                 Values.add(vs);  
    135.             }  
    136.   
    137.         }  
    138.   
    139.         return Values;  
    140.     }  
    141.   
    142. }  

    3.DBUtil
    [java] view plain copy
     
    1. package com.bottle.stockmanage;  
    2.   
    3. import java.sql.Connection;  
    4. import java.util.ArrayList;  
    5. import java.util.HashMap;  
    6. import java.util.List;  
    7.   
    8. public class DBUtil {  
    9.     private ArrayList<String> arrayList = new ArrayList<String>();  
    10.     private ArrayList<String> brrayList = new ArrayList<String>();  
    11.     private ArrayList<String> crrayList = new ArrayList<String>();  
    12.     private HttpConnSoap Soap = new HttpConnSoap();  
    13.   
    14.     public static Connection getConnection() {  
    15.         Connection con = null;  
    16.         try {  
    17.             //Class.forName("org.gjt.mm.mysql.Driver");  
    18.             //con=DriverManager.getConnection("jdbc:mysql://192.168.0.106:3306/test?useUnicode=true&characterEncoding=UTF-8","root","initial");               
    19.         } catch (Exception e) {  
    20.             //e.printStackTrace();  
    21.         }  
    22.         return con;  
    23.     }  
    24.   
    25.     /** 
    26.      * 获取所有货物的信息 
    27.      *  
    28.      * @return 
    29.      */  
    30.     public List<HashMap<String, String>> getAllInfo() {  
    31.         List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();  
    32.   
    33.         arrayList.clear();  
    34.         brrayList.clear();  
    35.         crrayList.clear();  
    36.   
    37.         crrayList = Soap.GetWebServre("selectAllCargoInfor", arrayList, brrayList);  
    38.   
    39.         HashMap<String, String> tempHash = new HashMap<String, String>();  
    40.         tempHash.put("Cno", "Cno");  
    41.         tempHash.put("Cname", "Cname");  
    42.         tempHash.put("Cnum", "Cnum");  
    43.         list.add(tempHash);  
    44.           
    45.         for (int j = 0; j < crrayList.size(); j += 3) {  
    46.             HashMap<String, String> hashMap = new HashMap<String, String>();  
    47.             hashMap.put("Cno", crrayList.get(j));  
    48.             hashMap.put("Cname", crrayList.get(j + 1));  
    49.             hashMap.put("Cnum", crrayList.get(j + 2));  
    50.             list.add(hashMap);  
    51.         }  
    52.   
    53.         return list;  
    54.     }  
    55.   
    56.     /** 
    57.      * 增加一条货物信息 
    58.      *  
    59.      * @return 
    60.      */  
    61.     public void insertCargoInfo(String Cname, String Cnum) {  
    62.   
    63.         arrayList.clear();  
    64.         brrayList.clear();  
    65.           
    66.         arrayList.add("Cname");  
    67.         arrayList.add("Cnum");  
    68.         brrayList.add(Cname);  
    69.         brrayList.add(Cnum);  
    70.           
    71.         Soap.GetWebServre("insertCargoInfo", arrayList, brrayList);  
    72.     }  
    73.       
    74.     /** 
    75.      * 删除一条货物信息 
    76.      *  
    77.      * @return 
    78.      */  
    79.     public void deleteCargoInfo(String Cno) {  
    80.   
    81.         arrayList.clear();  
    82.         brrayList.clear();  
    83.           
    84.         arrayList.add("Cno");  
    85.         brrayList.add(Cno);  
    86.           
    87.         Soap.GetWebServre("deleteCargoInfo", arrayList, brrayList);  
    88.     }  
    89. }  

    4.activity_main.xml
    [html] view plain copy
     
    1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    2.     xmlns:tools="http://schemas.android.com/tools"  
    3.     android:layout_width="fill_parent"  
    4.     android:layout_height="fill_parent" >  
    5.   
    6.     <ListView  
    7.         android:id="@+id/listView"  
    8.         android:layout_width="fill_parent"  
    9.         android:layout_height="fill_parent"  
    10.         android:visibility="gone" >  
    11.     </ListView>  
    12.   
    13.     <Button  
    14.         android:id="@+id/btn_all"  
    15.         android:layout_width="wrap_content"  
    16.         android:layout_height="wrap_content"  
    17.         android:layout_above="@+id/btn_add"  
    18.         android:layout_alignLeft="@+id/btn_add"  
    19.         android:layout_marginBottom="10dip"  
    20.         android:text="@string/btn1" />  
    21.   
    22.     <Button  
    23.         android:id="@+id/btn_add"  
    24.         android:layout_width="wrap_content"  
    25.         android:layout_height="wrap_content"  
    26.         android:layout_centerHorizontal="true"  
    27.         android:layout_centerVertical="true"  
    28.         android:text="@string/btn2" />  
    29.   
    30.     <Button  
    31.         android:id="@+id/btn_delete"  
    32.         android:layout_width="wrap_content"  
    33.         android:layout_height="wrap_content"  
    34.         android:layout_alignLeft="@+id/btn_add"  
    35.         android:layout_below="@+id/btn_add"  
    36.         android:layout_marginTop="10dip"  
    37.         android:text="@string/btn3" />  
    38.   
    39. </RelativeLayout>  

    5.adapter_item.xml
    [html] view plain copy
     
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:layout_width="fill_parent"  
    4.     android:layout_height="wrap_content"  
    5.     android:descendantFocusability="blocksDescendants"  
    6.     android:gravity="center" >  
    7.   
    8.     <TableRow  
    9.         android:id="@+id/classroom_detail_item_tableRow"  
    10.         android:layout_width="fill_parent"  
    11.         android:layout_height="wrap_content"  
    12.         android:gravity="center" >  
    13.   
    14.         <TextView  
    15.             android:id="@+id/txt_Cno"  
    16.             android:layout_width="80dp"  
    17.             android:layout_height="wrap_content"  
    18.             android:gravity="center"  
    19.             android:height="40dp"  
    20.             android:textSize="14sp" >  
    21.         </TextView>  
    22.   
    23.         <TextView  
    24.             android:id="@+id/txt_Cname"  
    25.             android:layout_width="80dp"  
    26.             android:layout_height="wrap_content"  
    27.             android:gravity="center"  
    28.             android:height="40dp"  
    29.             android:textSize="14sp" >  
    30.         </TextView>  
    31.   
    32.         <TextView  
    33.             android:id="@+id/txt_Cnum"  
    34.             android:layout_width="80dp"  
    35.             android:layout_height="wrap_content"  
    36.             android:gravity="center"  
    37.             android:height="40dp"  
    38.             android:textSize="14sp" >  
    39.         </TextView>  
    40.   
    41.     </TableRow>  
    42.   
    43. </TableLayout>  

    6.dialog_add.xml
    [html] view plain copy
     
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:layout_width="fill_parent"  
    4.     android:layout_height="fill_parent"  
    5.     android:orientation="vertical" >  
    6.   
    7.     <EditText  
    8.         android:id="@+id/editText1"  
    9.         android:layout_width="fill_parent"  
    10.         android:layout_height="wrap_content"  
    11.         android:ems="10"  
    12.         android:hint="@string/add_hint1" >  
    13.   
    14.         <requestFocus />  
    15.     </EditText>  
    16.   
    17.     <EditText  
    18.         android:id="@+id/editText2"  
    19.         android:layout_width="fill_parent"  
    20.         android:layout_height="wrap_content"  
    21.         android:ems="10"  
    22.         android:hint="@string/add_hint2"  
    23.         android:inputType="number" />  
    24.   
    25.     <LinearLayout  
    26.         android:layout_width="fill_parent"  
    27.         android:layout_height="wrap_content"  
    28.         android:orientation="horizontal" >  
    29.   
    30.         <Button  
    31.             android:id="@+id/button1"  
    32.             android:layout_width="100dip"  
    33.             android:layout_height="wrap_content"  
    34.             android:layout_marginLeft="20dip"  
    35.             android:text="@string/confirm" />  
    36.   
    37.         <Button  
    38.             android:id="@+id/button2"  
    39.             android:layout_width="100dip"  
    40.             android:layout_height="wrap_content"  
    41.             android:layout_marginLeft="40dip"  
    42.             android:text="@string/cancel" />  
    43.     </LinearLayout>  
    44.   
    45. </LinearLayout>  

    7.dialog_delete.xml
    [html] view plain copy
     
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:layout_width="fill_parent"  
    4.     android:layout_height="fill_parent"  
    5.     android:orientation="vertical" >  
    6.   
    7.     <EditText  
    8.         android:id="@+id/editText1"  
    9.         android:layout_width="fill_parent"  
    10.         android:layout_height="wrap_content"  
    11.         android:ems="10"  
    12.         android:hint="@string/delete_hint" >  
    13.   
    14.         <requestFocus />  
    15.     </EditText>  
    16.   
    17.     <LinearLayout  
    18.         android:layout_width="fill_parent"  
    19.         android:layout_height="wrap_content"  
    20.         android:orientation="horizontal" >  
    21.   
    22.         <Button  
    23.             android:id="@+id/button1"  
    24.             android:layout_width="100dip"  
    25.             android:layout_height="wrap_content"  
    26.             android:layout_marginLeft="20dip"  
    27.             android:text="@string/confirm" />  
    28.   
    29.         <Button  
    30.             android:id="@+id/button2"  
    31.             android:layout_width="100dip"  
    32.             android:layout_height="wrap_content"  
    33.             android:layout_marginLeft="40dip"  
    34.             android:text="@string/cancel" />  
    35.     </LinearLayout>  
    36.   
    37. </LinearLayout>  

    8.strings.xml
    [html] view plain copy
     
    1. <resources>  
    2.   
    3.     <string name="app_name">StockManagement</string>  
    4.     <string name="menu_settings">Settings</string>  
    5.     <string name="title_activity_main">MainActivity</string>  
    6.     <string name="btn1">查看所有货物信息</string>  
    7.     <string name="btn2">增加一条货物信息</string>  
    8.     <string name="btn3">删除一条货物信息</string>  
    9.     <string name="add_hint1">输入添加的货物的名称</string>  
    10.     <string name="add_hint2">输入货物的数量</string>  
    11.     <string name="confirm">确定</string>  
    12.     <string name="cancel">取消</string>  
    13.     <string name="delete_hint">输入删除的货物的编号</string>  
    14.   
    15. </resources>  

    9.Manifest.xml
    [html] view plain copy
     
    1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
    2.     package="com.bottle.stockmanage"  
    3.     android:versionCode="1"  
    4.     android:versionName="1.0" >  
    5.   
    6.     <uses-sdk  
    7.         android:minSdkVersion="7"  
    8.         android:targetSdkVersion="15" />  
    9.   
    10.     <uses-permission android:name="android.permission.INTERNET" />  
    11.   
    12.     <application  
    13.         android:icon="@drawable/ic_launcher"  
    14.         android:label="@string/app_name"  
    15.         android:theme="@android:style/Theme.NoTitleBar" >  
    16.         <activity  
    17.             android:name=".MainActivity"  
    18.             android:label="@string/title_activity_main"  
    19.             android:screenOrientation="portrait" >  
    20.             <intent-filter>  
    21.                 <action android:name="android.intent.action.MAIN" />  
    22.   
    23.                 <category android:name="android.intent.category.LAUNCHER" />  
    24.             </intent-filter>  
    25.         </activity>  
    26.     </application>  
    27.   
    28. </manifest>  

    运行程序的效果如下图所示:

    再说一下IIS,如果只是在本地进行测试等操作,是不需要使用到IIS的,但是如果想发布出去,就要配置一下IIS。

    好啦,基本就是这样了。程序不是完善的,但大概的思路就是这样,用到的技术也大概就是这几样,但是每一样拿出来都够学一阵的了。

    --->2012.12.02 增加内容

    附上本文demo的CSDN下载地址

    http://download.csdn.net/detail/zhyl8157121/4836107

    --->2013.01.08 增加内容

    解释一下android端如何和webservice通信的。(如何修改实例程序)

    具体的更深层的东西已经在HttpSoap中封装好了,所以大家使用的时候可以直接用这个类就可以了。(我也不懂是怎么实现的……)

    android调用的方法就是如DBUtil中那样,比如内嵌图片 2

    其中arrayList中和brrayList中分别存放对应的webservice中“selectAllCargoInfor”方法的参数名和参数的值。

    内嵌图片 3

    由于webservice中的selectAllCargoInfo方法的参数为空,所以对应的,android端调用的时候,arrayList和brrayList的值就是空的。

     所以大家在使用的时候,只需要将webservice中的方法写好,然后写好DBUtil中的调用参数即可。

    --->2013.03.23 增加内容

    如果获取值为空,可能是返回值是复杂类型造成的,可以参考:http://blog.csdn.net/zhyl8157121/article/details/8709048

    --->2014.07.18 增加内容

    没想到这么长时间了还能得到大家的青睐,很欣慰。

    之前收到过一些同学发来的邮件,问题大概以下几种,这里统一答复一下吧,希望给有问题的同学一个参考。

    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语句错误、按钮监听错误等问题大家细心查查就行了。

    不出什么意外的话,本文不会再更新了,楼主已经很久不搞Android了,有些东西也稍微有点生疏了。

    以前有些同学给我发邮件或者私信我是每个都回复的,不管问的问题我自己会不会。工作了之后就比较忙了,而且Gmail经常上不去(你懂的),有些同学的邮件就没有回复,在此向那些我没有回复的同学说声抱歉,大家都是来交流的,我绝对不是高傲或者懒散,交个朋友也好。

    大家不要问QQ号了,那个东西不太适合技术交流,还是邮箱来的实在,这能让彼此的思考时间多一些。

    再次留下我的邮箱:bottle.liang@gmail.com 如果有什么问题,欢迎大家来信交流。

    谢谢支持,欢迎大家批评指正。

  • 相关阅读:
    494 Target Sum 目标和
    493 Reverse Pairs 翻转对
    492 Construct the Rectangle 构建矩形
    491 Increasing Subsequences 递增子序列
    488 Zuma Game 祖玛游戏
    486 Predict the Winner 预测赢家
    485 Max Consecutive Ones 最大连续1的个数
    483 Smallest Good Base
    Django Form组件
    Django Auth组件
  • 原文地址:https://www.cnblogs.com/hbtmwangjin/p/8086631.html
Copyright © 2011-2022 走看看