第一次在这里写博文,很是紧张,不知从何下笔,主要是文笔很差,但又很想分享一点东西给大家,希望大家能我一点支持
在android查询数据是通过cursor类来实现的,使用sqlitedatabase.query()方法就能得到cursor,cursor是每行的集合。解析cursor时,如果只是解析一行,可通过moveToFirst()方法定位到第一行,再解析,如果是多于一行的,则可以在while循环条件里加上moveToNext()定位,再解析。
当cursor数据只有一行时,代码优化上会比较省事,基本上不用担心会因代码不好影响性能。但是如果数据量很多时,代码如果没有经过优化,对解析的速度是影响很大的。
在定位后解析cursor时,我们一般的做法是首先通过getColumnIndex(String columnName)方法来获得列的索引值,然后再通过列的索引值获得对应的数据。就像下面这样(联系人的部分数据解析):
while(cursor.moveToNext){
String name = cursor.getString(cursor.getColumnIndex(People.Name));
String phoneNo = cursor.getString(cursor.getColumnIndex(People.Number));
}
上面的代码没有任何错误,最后解析出来的结果也是完全正确。但是我要说这段代码其实写的很差,在一定量的联系人数据时,运行速度会相当慢。你可以用这种代码写出来的程序跟系统自带的通讯录(或者QQ通讯录)来比较一下三百多联系人的数据就知道有多慢了。
这里我们只要稍稍的做一下优化,速度将会有个质的提升。改造如下:
int nameIndex = cursor.getColumnIndex(People.Name);
int numberIndex = cursor.getColumnIndex(People.NUMBER);
while(cursor.moveToNext){
String name = cursor.getString(nameIndex);
String phoneNo = cursor.getString(numberIndex);
}
经过改造后,你可以再测试一下三百多条联系人的数据,肯定是基本接近系统联系人的速度(在不加载头像的情况,头像要用另外一套机制去解决,这里不作讨论);
看了这两段代码,相信大家都应该知道我是怎么改造的了。对的,就是把列的索引值获取提取到循环前面去。别小看这一点点的修改,它可是能帮你大忙的。这样修改的好处就是能让程序避免重复去获得这些列的索引值,使程序运行效率更高,特别是在写联系人的程序时很有效。你可以举一返三,在我们平时写代码时很多逻辑都可以这样去优化。
最后,记得解析完后要关闭cursor。
写的可能有点乱,但应该很好理解,有什么不对的地方敬请指正
原创文章,转载请注明出处:http://blog.youkuaiyun.com/iku22/article/details/7528351。