关于安卓通过webservice访问数据库问题

问题描述:

访问数据库时,手机能增删数据库的数据就是显示不了数据库的里的数据不知道是哪里的问题,用的HTTP
这是我webservice中的产看所有信息的方法:

public List<string> selectAllCargoInfor()
        {
            List<string> list = new List<string>();

            try
            {
                string sql = "select * from C";
                SqlCommand cmd = new SqlCommand(sql,sqlCon);
                SqlDataReader reader = 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)
            {

            }
            return list;
        }

接下来是安卓端的:
这个是MainActivity中的设置LISTVIEW的方法

private void setListView() {
        listView.setVisibility(View.VISIBLE);
        List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
        list = dbUtil.getAllInfo();
        adapter = new SimpleAdapter(MainActivity.this, list, R.layout.adapter_item,
        new String[] { "Cno", "Cname", "Cnum" },
        new int[] { R.id.txt_Cno, R.id.txt_Cname, R.id.txt_Cnum });
        listView.setAdapter(adapter);
    }

这个是操作类:

public List<HashMap<String, String>> getAllInfo() {
        List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();

        arrayList.clear();
        brrayList.clear();
        crrayList.clear();

        new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                crrayList = Soap.GetWebServre("selectAllCargoInfor", arrayList, brrayList);
            }
        }).start();

        HashMap<String, String> tempHash = new HashMap<String, String>();
        tempHash.put("Cno", "Cno");
        tempHash.put("Cname", "Cname");
        tempHash.put("Cnum", "Cnum");
        list.add(tempHash);

        for (int j = 0; j < crrayList.size(); j += 3) {
            HashMap<String, String> hashMap = new HashMap<String, String>();
            hashMap.put("Cno", crrayList.get(j));
            hashMap.put("Cname", crrayList.get(j + 1));
            hashMap.put("Cnum", crrayList.get(j + 2));
            list.add(hashMap);
        }

        return list;
    }

连接webservice的那个方法HttpConnSoap应该是没问题的因为数据库的增删都是可以的,就是无法实现这个显示所有信息到LISTVIEW中的这个功能不知道为什么,LOGCAT中也是一片绿没什么问题

LOGCAT中的信息:
05-02 15:51:40.642: I/System.out(3678): <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><selectAllCargoInforResponse xmlns="http://tempuri.org/"><selectAllCargoInforResult><string>1</string><string>rice</string><string>100</string><string>2</string><string>dog</string><string>50</string><string>3</string><string>白痴</string><string>25</string></selectAllCargoInforResult></selectAllCargoInforResponse></soap:Body></soap:Envelope>
05-02 15:51:40.647: I/System.out(3678): <?xml version="1.0" encoding="utf-8"?
05-02 15:51:40.647: I/System.out(3678): soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
05-02 15:51:40.647: I/System.out(3678): soap:Body
05-02 15:51:40.647: I/System.out(3678): selectAllCargoInforResponse xmlns="http://tempuri.org/"
05-02 15:51:40.647: I/System.out(3678): selectAllCargoInforResult
05-02 15:51:40.647: I/System.out(3678): 0
05-02 15:51:40.647: I/System.out(3678): string>1</string
05-02 15:51:40.647: I/System.out(3678): string>rice</string
05-02 15:51:40.647: I/System.out(3678): string>100</string
05-02 15:51:40.647: I/System.out(3678): string>2</string
05-02 15:51:40.652: I/System.out(3678): string>dog</string
05-02 15:51:40.652: I/System.out(3678): string>50</string
05-02 15:51:40.652: I/System.out(3678): string>3</string
05-02 15:51:40.652: I/System.out(3678): string>白痴</string
05-02 15:51:40.652: I/System.out(3678): string>25</string
05-02 15:51:40.652: I/System.out(3678): /selectAllCargoInforResult
05-02 15:51:40.652: I/System.out(3678): 1

解决方案1:

分析原因就是在线程还没有执行完时候,getAllInfo早已执行完毕以后,,所以在执行for (int j = 0; j < crrayList.size(); j += 3)时候, crrayList为零行。你取出的LOGCAT是执行请求以后的返回数据,这时候setListView方法早已经走完,所以只有一行数据。截图中的一行数据来自       
       HashMap<String, String> tempHash = new HashMap<String, String>();
        tempHash.put("Cno", "Cno");
        tempHash.put("Cname", "Cname");
        tempHash.put("Cnum", "Cnum");
        list.add(tempHash);
使用Thread应该配合Handler来使用。

我把代码修改一下

    private final static int   REQUEST_SUCCESS = 1;
    private final static int   REQUEST_FALSE = 0;

    private void RequestData()
    {
        arrayList.clear();
        brrayList.clear();
        crrayList.clear();

        new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                crrayList = Soap.GetWebServre("selectAllCargoInfor", arrayList, brrayList);
                Message msg = new Message();
                if(crrayList.size()>0)
                {
                    msg.what = REQUEST_SUCCESS;
                }
                else
                {
                    msg.what = REQUEST_FALSE;
                }
                // 发送消息
                mHandler.sendMessage(msg);
            }
        }).start();
    }

    public Handler mHandler = new Handler(){ 

          // 接收消息
          @Override
          public void handleMessage(Message msg) {
              // TODO Auto-generated method stub
              super.handleMessage(msg);
              switch (msg.what)
            {
                case REQUEST_SUCCESS:
                    setListView();
                    break;
                case REQUEST_FALSE:
                    // 做错误处理
                    break;
                default:
                    break;
            }
          } 

      }; 

      private void setListView() {
          listView.setVisibility(View.VISIBLE);
          List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
          list = dbUtil.getAllInfo();
          adapter = new SimpleAdapter(MainActivity.this, list, R.layout.adapter_item,
          new String[] { "Cno", "Cname", "Cnum" },
          new int[] { R.id.txt_Cno, R.id.txt_Cname, R.id.txt_Cnum });
          listView.setAdapter(adapter);
      }

      public List<HashMap<String, String>> getAllInfo() {
          List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
          HashMap<String, String> tempHash = new HashMap<String, String>();
          tempHash.put("Cno", "Cno");
          tempHash.put("Cname", "Cname");
          tempHash.put("Cnum", "Cnum");
          list.add(tempHash);

          for (int j = 0; j < crrayList.size(); j += 3) {
              HashMap<String, String> hashMap = new HashMap<String, String>();
              hashMap.put("Cno", crrayList.get(j));
              hashMap.put("Cname", crrayList.get(j + 1));
              hashMap.put("Cnum", crrayList.get(j + 2));
              list.add(hashMap);
          }
          return list;
      }

执行RequestData就可以,我没法编译,细节自己再调整看一下,应该能解决问题了。
你给的分数太少了,大牛们都不给你解答。如果解决问题就给分哈。

另外,Java多线程的操作可以系统学习一下。工作中使用极为频繁。

时间: 2024-10-14 05:49:49

关于安卓通过webservice访问数据库问题的相关文章

javaweb三、JDBC访问数据库

JDBC是J2SE的内容,是由java提供的访问数据库的接口,但没有提供具体的实现方法,需要数据库厂商提供,就是对应的数据库驱动. 这样的好处是可以方便的更换数据库,提高了扩展性.这也是面向接口编程的一个优点. 1 import java.sql.Connection; 2 import java.sql.DriverManager; 3 import java.sql.ResultSet; 4 import java.sql.SQLException; 5 import java.sql.St

使用ab.exe监测100个并发/100次请求情况下同步/异步访问数据库的性能差异

ab.exe介绍 ab.exe是apache server的一个组件,用于监测并发请求,并显示监测数据 具体使用及下载地址请参考:http://www.cnblogs.com/gossip/p/4398784.html 本文的目的 通过webapi接口模拟100个并发请求下,同步和异步访问数据库的性能差异 创建数据库及数据 --创建表结构 CREATE TABLE dbo.[Cars] ( Id INT IDENTITY(1000,1) NOT NULL, Model NVARCHAR(50) 

项目小结-JDBC访问数据库的基本步骤

JDBC访问数据库的基本步骤: (1)将数据库的JDBC驱动加载到classpath中,在基于javaEE的web应用实际开发过程中, 通常把目标产品的JDBC驱动复制到WEB-INF/lib中 (2)加载JDBC驱动,将其注册到DriverManager中 //Oracle8/8i/9i(thin模式)数据库 Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); //Sql server2005数据库 Clas

PHP 访问数据库

访问数据库步骤: 1.造一个连接对象 1 $db = new MYSQLi("localhost","root","123","mydb"); 2.判断连接是否出错 1 !mysqli_connect_error() or die("连接失败!"); 3.写SQL语句 1 $sql = "select * from Info"; 4.执行SQL语句,查询语句如果执行成功返回结果集对象,如

Java访问数据库

首先简介一下JDBC: JDBC:Java DataBase Connection. JDBC:Java数据库连接.它是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问. 它由一组用Java语言编写的类和接口组成. JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名. 一.Java访问数据库的原理: 举个例子来讲:Oracle.SQLServer.MySQL.DB2等数据库可以类比为“水厂”,Con

ADO.NET 连接方式和非链接方式访问数据库

//连接方式访问数据库的主要步骤 1.创建连接对象(l链接字符串) 2.创建命令对象(设置Command对象的几个属性值) 3.打开连接 4.发送命令 5.处理数据 6.关闭连接 //非链接方式访问数据库 1/创建连接对象 2.创建数据适配器对象 3.打开连接 4.发送命令 5.关闭连接

定义通用访问数据库类

最近在公司看封装的代码,访问数据库很方便,我们只需定义Model,便可访问数据库,当然了都是封装的dll,因此自己也试着写了一个,现在做个记录. 下面是特性标签的定义,主要用于获取本地属性定义和数据库定义以及数据库字段定义: public class DataMappingAttribute : Attribute { private string localName, dbName; private string type; public DataMappingAttribute(string

非链接方式访问数据库--查询的数据集用Dataset来存储。

private void Button_Click_1(object sender, RoutedEventArgs e) { //非链接方式访问数据库, //1创建连接对象(连接字符串) using (SqlConnection conn = new SqlConnection(SQLHelper.ConnectionString)) { //2.创建数据适配器对象 using (SqlDataAdapter sda = new SqlDataAdapter("select * from St

Java访问数据库Mysql

一.概述 本文主要介绍Java接连数据库的基本方法和步骤,并对其中的几个要点进行简要说明. 二.数据库访问步骤 在Java中连接数据库进行的访问主要有以下几个步骤: 加载数据库驱动 注册数据库驱动 建立到数据库的连接 访问数据库 首先,要调用Class.ForName()加载并注册mysql驱动程序类,加载驱动程序驱动类后,需要注册驱动程序类的一个实例,DriverManager类负责管理驱动程序,这个类提供了registerDriver()方法来注册驱动程序类的实例,并且我们不需要亲自调用这个