总结初次使用SQLite的错误点

总结初次使用SQLite的错误点,第1张

概述完整代码及功能说明在下一篇文章中,这里只挑选项目的几个大bug。 1.在写查询所有数据的函数getAllData()时,由于写了db.close(),提前关闭了数据库导致错误。(后来找到这个原因后我就注释了)(其实我不懂为什么会出错,我觉得query *** 作已经把数据内容导进Cursor对象了,那把数据库关闭了也没有问题吧?可是就是有问题。。。) public Member[] getAllData(

完整代码及功能说明在下一篇文章中,这里只挑选项目的几个大BUG。

1.在写查询所有数据的函数getAllData()时,由于写了db.close(),提前关闭了数据库导致错误。(后来找到这个原因后我就注释了)(其实我不懂为什么会出错,我觉得query *** 作已经把数据内容导进Cursor对象了,那把数据库关闭了也没有问题吧?可是就是有问题。。。)

public Member[] getAllData(){		Log.e("jinru","get0");		sqliteDatabase db=getReadableDatabase();		Log.e("jinru","get1");		Cursor result=null;		result=db.query(table_name,null,null);		Log.e("jinru","get2");//		db.close();		Log.e("jinru","get3");		return ConvertToMember(result);	}
顺便把ConvertToMember也贴出来,功能就是把Cursor对象的内容转到Member[]。
private Member[] ConvertToMember(Cursor cursor){		Log.e("jinru","wei0");		try{int resultCounts=cursor.getCount();		Log.e("resultcount",""+resultCounts);		Log.e("jinru","wei1");		if(resultCounts==0||!cursor.movetoFirst()){			Log.e("jinru","jinru");			return null;		}		Log.e("jinru","chu");		Member[] members=new Member[resultCounts];		for(int i=0;i<resultCounts;i++){			members[i]=new Member();			members[i].setID(cursor.getInt(0));			members[i].setname(cursor.getString(cursor.getColumnIndex("name")));			members[i].setPhone(cursor.getString(cursor.getColumnIndex("info")));			cursor.movetoNext();		}		return members;}catch(Exception e){			e.printstacktrace();			return null;		}	}

注意到上面两个函数我都用了许多Log.e来调试,差不多每一行就返回一句日志信息,目的是检查程序运行到到底哪一行崩溃的(当时查了好久,把我也搞崩溃了。。。毕竟菜鸟)。当时Eclipse没有提示我到底是哪里出错,所以我只能手动慢慢找,出错信息(更过分的是这只是warn,不是error)如下:

在找到是运行到下面这行代码出问题后,我再用try和catch来捕捉到具体的错误原因。

int resultCounts=cursor.getCount();
具体的错误原因为:

很长很罗嗦,但是我们最重要的是抓住两个点,第一个是错误内容描述,第二个是你的哪些代码导致了这个错误,分别如下:


根据这些信息,上网查找了一番,在这个网页找到提示 http://bbs.csdn.net/topics/390882809 。最后把db.close()注释掉!解决!!


2.第二个错误说来有点逗比,问题代码如下

public class MainActivity extends Activity {	private static final String TAG="test1";	public MemberDAO memberDAO=new MemberDAO(this);	public Member[] members=memberDAO.getAllData();

我把memberDAO.getAllData()的 *** 作放在onCreate外面了,这个问题和第一个问题都是导致APP完全无法打开,一打开就sorry,XXX停止运行。而且报一样的错误:

当然把memberDAO.getAllData()的 *** 作放到onCreate里面就OK了。


3.第三个出现的BUG是我写了getoneData(long ID)这个函数,作用是根据ID找到数据库中对应的那条数据。

public Member[] getoneData(long ID){		sqliteDatabase db=getReadableDatabase();		Cursor result=null;		result=db.rawquery("select * from "+table_name+" where _ID=?",new String[]{""+ID}); 		return ConvertToMember(result);	}
但是在实际使用过程中,我发现它没有检索到任何记录,一开始我以为是语法逻辑上出了问题,还用db.query又试了一次,发现还是不行。经过努力,发现问题出在数据库中的_ID是自动递加的,而且不会应为删除 *** 作而改变。例如:

_ID name phone position

1 John 12345 0

2 Mike 16789 1

3 Mary 26538 2

前三列是实际存储在数据库的数据,最后一项position是在屏幕中看到的列表的位置,现在看起来position和_ID是有关系的,我们貌似可以用position去得到_ID,而我在getoneData函数中也确实是这样做的,但是当我们删除了一条记录后,比如说第二条,情况变成:

_ID name phone position

1 John 12345 0

3 Mary 26538 1

然后在增加一条记录:

_ID name phone position

1 John 12345 0

3 Mary 26538 1

4 Herry 15908 2

可以看到,如果在经过多次的删除和新增 *** 作后,position和_ID将不具有任何关系,所以不可以用position直接得到_ID。这就是getoneData的问题所在。


4.第四个出现的问题是:

Member[] members=memberDAO.getAllData();if(members==null){ 	Log.e(TAG,"setDataReturn");	return;}int count=members.length;
需要先判断得到的数组members是否为空,如果为空的话,调用members.length会出错。起始就是数组长度为0和数组为null的区别,参考http://www.th7.cn/Program/java/2012/02/01/57613.sHTML 。 总结

以上是内存溢出为你收集整理的总结初次使用SQLite的错误点全部内容,希望文章能够帮你解决总结初次使用SQLite的错误点所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1170284.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存