博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于安卓通过webservice访问数据库问题
阅读量:6306 次
发布时间:2019-06-22

本文共 6740 字,大约阅读时间需要 22 分钟。

============问题描述============

访问数据库时,手机能增删数据库的数据就是显示不了数据库的里的数据不知道是哪里的问题,用的HTTP
这是我webservice中的产看所有信息的方法:
public List
 selectAllCargoInfor()        {            List
 list = new List
();            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
> list = new ArrayList
>(); 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
> getAllInfo() { List
> list = new ArrayList
>(); 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
 tempHash = new HashMap
(); 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
 hashMap = new HashMap
(); 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
> list = new ArrayList
>();          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
> getAllInfo() {          List
> list = new ArrayList
>();          HashMap
 tempHash = new HashMap
();          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
 hashMap = new HashMap
();              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多线程的操作可以系统学习一下。工作中使用极为频繁。

转载于:https://www.cnblogs.com/meizhenfen42/p/4089416.html

你可能感兴趣的文章
面试/编程
查看>>
linux每日命令(16):head命令
查看>>
公司内部分享【富有成效的每日站会】总结
查看>>
打造一个上传图片到图床利器的插件(Mac版 开源)
查看>>
iOS横竖屏
查看>>
thinkphp判断更新是否成功
查看>>
Do While ... Loop 与 Do Until ... Loop 的区别
查看>>
【Linux】查询某个字符串出现次数
查看>>
高效使用jquery之一:请使用'On'函数
查看>>
冲刺第一周第三天
查看>>
ERP环境检测工具设计与实现 Environment Detection
查看>>
不要在构造中做太多事情,不然有时候会出现有意思的代码~
查看>>
IIS 发布网站遇到的问题
查看>>
NuGet学习笔记(2)——使用图形化界面打包自己的类库
查看>>
xcode中没有autoSizing的设置
查看>>
字符编码
查看>>
企业应用:应用层查询接口设计
查看>>
浅谈Excel开发:十 Excel 开发中与线程相关的若干问题
查看>>
nfd指令的详细说明
查看>>
安装VisualSvn Server时遇到的问题
查看>>