7、耗时异步化(大数据量操作时最好用异步线程处理)
tip:Sqlite是常用于嵌入式开发中的关系型数据库,完全开源。与Web常用的数据库Mysql、Oracle db、sql server不同,Sqlite是一个内嵌式的数据库,数据库服务器就在你的程序中,无需网络配置和管理,数据库服务器端和客户端运行在同一进程内,减少了网络访问的消耗,简化了数据库管理。不过Sqlite在并发、数据库大小、网络方面存在局限性,并且为表级锁,所以也没必要多线程操作。Android中数据不多时表查询可能耗时不多,不会导致anr,不过大于100ms时同样会让用户感觉到延时和卡顿,可以放在线程中运行,但sqlite在并发方面存在局限,多线程控制较麻烦,这时候可使用单线程池,在任务中执行db操作,通过handler返回结果和ui线程交互,既不会影响UI线程,同时也能防止并发带来的异常。实例代码如下:
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
singleThreadExecutor.execute(new Runnable() { //建立异步线程处理
@Override
public void run() { // 执行sql操作数据库后发送消息
db.insert(yourTableName, null, value);
handler.sendEmptyMessage(xx);
}
}
);
我们在使用SQLite进行数据存储查询的时候,要进行查询优化,这里就会用到索引,Client端的数据量大部分情况下面虽然不是很大,但良好的索引建立习惯往往会带来不错的查询性能提升,同时在未知的将来经得住更大数据的考验,那如何优化数据库查询呢,下面我们用例子来演示下
先建个测试表test,包含了三个索引:
sqlite> .schem
CREATE TABLE test(id integer primary key not null default 0,a integer,b integer, c integer);
CREATE INDEX a_i on test(a);
CREATE INDEX a_i2 on test(a,b);
CREATE INDEX a_i3 on test©;
之后EXPLAIN QUERY PLAN:
sqlite> explain QUERY PLAN select * from test;
0|0|0|SCAN TABLE test
这条SQL语句是查询了整张表,所以结果关键字SCAN表示要完整遍历,这种效率是最低的,接下来我们试试加个查询条件:
sqlite> explain QUERY PLAN select * from testwhere a=1;
0|0|0|SEARCH TABLE testUSING INDEX a_i2 (a=?)
加上where a=1之后关键字变成了SEARCH,表示不再需要遍历了,而是使用了索引进行了部分检索,另外这条输出还有更多信息,比如使用了索引a_i2,而括号里面的a=?则表示是这个查询条件引起的我们稍微修改下SQL:
sqlite> explain QUERY PLAN select a from table1 where a=1;
0|0|0|SEARCH TABLE table1 USING COVERING INDEX a_i (a=?)
把select 变成了select a,发现explain输出有细微变化,从INDEX变成了COVERING INDEX,CONVERING INDEX表示直接使用索引查询就可以得到结果,不需要再次回查数据表,这样效率更高。而之前的查询因为是使用,索引里面只有a记录,所以必须要查询原始记录才能得到b,c字段。
1、这里我专门来测试一下getColumnIndex的速度问题
查询一条数据
查询一条信息的数据,调用到经过测试,输出的时间为43毫秒。
之后写上另个方法:把显示列前面定义出来,然后直接取列的序号
按照这样的方法查询一条信息的数据,调用到经过测试,输出的时间为42毫秒。与上面的基本没有什么变化。接下来我们进行查询多条数据的对比:
查询多条数据
第一个是使用了getcolumnindex方法的查询:
执行查询过程,调用到经过测试,输出的时间为11366毫秒.
之后是将getcolumnindex方法去掉之后进行测试:
执行查询过程,调用到经过测试,输出的时间为10368毫秒.
结论
当我们在查询一条语句的时候,用getcolumnindex获取到对应列和直接取列的序号几乎没有影响。当我们查询很多数据的时候,会有一些变化,但是可能影响的也不算太大,不过有节省就算了一个优化了,还是建议我们在写的时候尽量少用到cursor.getcolumnindex方法。
2、利用android提高的的insert,query,update,deleteAPI与execSql,rawQuery函数执行原生的插入,查询,更新,删除语句操作花费时间的对比结果
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
…(img-oLx1myPO-1710919924861)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-3uliQJTa-1710919924861)]