新手学Android之如何以正确的姿势debug

来源:互联网 发布:js求两个集合的并集 编辑:程序博客网 时间:2024/05/03 01:53

前几天开始跟着郭神的书一起做天气预报的app,做到遍历全国省市县数据的时候就错了,查了大概有一天时间,终于把问题解决了。

因为直接上手做项目,所以很多东西不知道也没人教,只能靠google和书,当然还有群。


起初在系统报错的时候压根就不知道怎么解决,后来想起来郭神有讲过用logcat,于是我试着用debug+logcat找错,终于找到是在哪出了错。就是运行到下面这句查询数据库的时候出错。提示province_id没有。


但是查询数据库怎么会出错呢?于是我开始研究该怎么去查看我建立好的数据库,在网上找了一番资料,后来下了一个这个sqlite expert  professional推荐大家下,和那个sqlite admin一样好用,挺不错的。但是有打开软件还得有表给你打开啊!!后来又查了下资料,原来要有一个file explorer插件才能在eclipse下把数据库给导出来,于是又到网上下了个file explorer,在eclipse下安装好这个jar插件(具体怎么安装网上有很多教程,方便快捷)以后点击DDMS------>File explorer 可以看到很多文件,没有看到代表没装好,或者没有重启eclipse。那么打开data/data,找到下面属于自己的文件包,我的是com.chinaweather.app,点击选中数据表,点击红色箭头导出!!!导出的文件一定要用.db后缀命名。然后打开sqlite expert  professional就可以打开数据库文件了,可以看到上图我见了3个表,分别是city,county,以及province,province有数据,这个没有创建错,但是点击city没有province_id这一列...我想肯定是这个错了。如下


为了验证我的假设,于是我装逼的打开cmd,打算用adb shell用命令去看下有没有错,于是又去学了怎么用adb

首先要把你的adb的路径添加到你的PATH里面去,我的adb是在platform_tools下面,有的在tools下面,把真个路径如D:\adt-bundle-windows-x86-20140702\adt-bundle-windows-x86-20140702\sdk\platform-tools;添加到系统环境变量PATH(右键我的电脑---》高级系统设置——》环境变量)里面去以后打开CMD,在cmd下输入adb shell,在找到data这个文件,用cd命令进去,具体如:cd data/,在data文件下再ls下看到还有个data,再进去,这下我们就可以看到自己的数据库放在哪个文件包了。如我的就放在com.chinaweather.app,用cd命令切进去,一看可以看到databases,然后进去可以看到cool_weather这个文件,这个文件就是数据库文件了。


直接执行sqlite3 cool_weather进入数据库操作。(数据库操作命令可以百度或者谷歌)

因为前面讲到city表中感觉有错,所以运行了下.dump City这个命令,发现一个很细微的错误!!!原来我这边少了一个逗号!!!坑爹啊!!


于是我回到代码中把这出错误改正了回来,就是这段

/** * City表建表语句 */public static final String CREATE_CITY = "create table City("+ "id integer primary key autoincrement, "+ "city_name text, "+ "city_code text,"+ "province_id integer)";/** * County表建表语句 */public static final String CREATE_COUNTY = "create table COUNTY("+ "id integer primary key autoincrement, "+ "county_name text, "+ "county_code text,"+ "city_id integer)";
然后自以为就好了,但是新手就是不懂事啊!!!一运行有报错!!还是和原来一样的错,我就纳闷了,后来想了想是不是数据已经创建好了就不会去更新了,果然是这样的。在安卓里面有这么一段代码,假如刚开始没有数据库,那么系统第一次运行的时候会创建数据库,但是后来如果有数据库的时候就不会再创建了。

具体的就是这个函数!!!这个是在model--》coolWeatherDB.java文件里的,大体意思是获得一个实例,对实例进行私有化

/** * 将构造方法私有化 */private CoolWeatherDB(Context context){CoolWeatherOpenHelper dbHelper = new CoolWeatherOpenHelper(context, DB_NAME, null, VERSION);//Create and/or open a database that will be used for reading and writingdb = <span style="color:#ff0000;">dbHelper.getWritableDatabase</span>();    //在调用这个方法的时候假如是第一次,那么系统会先调用onCreate()创建数据库}/** * 获取CoolWwatherDB的实例 */public synchronized static CoolWeatherDB getInstance(Context context){if (coolWeatherDB == null){coolWeatherDB = new CoolWeatherDB(context);}return coolWeatherDB;}
,假如这个实例是第一次运行,那么好,运行onCreate创建数据库,onCreate方法在coolWeatherOpenHelper.java文件里,这个类继承SQLiteOpenHelper,SQLiteOpenHelper是安卓里专门用于创建和管理数据库的。



回到正题,正面我们说改掉了代码的错误,但是改掉了错误再次运行的时候已经不是第一次运行了,所以系统不会去调用onCreate去重新创建数据,所以假如在代码里面改回来是不行的!!!只有删掉数据库或者其他方法(暂时不知道)去重新建立一个数据库,所以又查了下资料,发现还是回到CMD下直接对数据库删除比较好,但是在adb shell下是不能直接进行数据库进行删除。要先运行adb remount,然后再运行adb shell进到目录删除,删除用rm -r   文件名,这是一个标准的linux删除命令。


删除了cool_weather.db 也就是数据库文件以后那么回到eclipse ,run。成功!!!


所以到此,我们debug总共用到了

1、 file explorer查看并导出数据库文件

2、用sqlite expert  professional查看了数据库里面的表有没有创建成功

3、用到了adb 的一些命令进行查看数据表的内容

虽然是一个小小的逗号引起的bug,但是在这过程中却学到了很多很多的东西,对于一个新手来说查资料并且耐心的分析和解决问题是最为重要的。



0 0
原创粉丝点击