当前位置: 代码迷 >> SQL >> android上SQLite性能优化的有关问题
  详细解决方案

android上SQLite性能优化的有关问题

热度:77   发布时间:2016-05-05 11:53:13.0
android上SQLite性能优化的问题
? ?1.利用android提高的的insert,query,update,deleteAPI与execSql,rawQuery函数执行原生的插入,查询,更新,删除语句操作花费时间的对比结果

? ? 在相同的环境(adnroid4.0)和相同的机器下执行相同的动作,记录条数也一样的情况下的对比,多次验证的如下:

? ? (1)如果批量执行的记录数在1000条,则Android SqliteDatabase提供的insert,query,update,delete函数和直接写SQL文的execSql,rawQuery的效率差不多,几乎一样。所以使用哪种放到都可以,不会影响到执行效率。

? ? (2)如果批量执行的记录数在10万条,则会存在差别。在某台手机上SqliteDatabase提供的insert执行插入操作耗时45秒,要比execSql插入35秒慢10秒左右。

? ? 可见在数据库大的情况下,还是有差别的。execSql省去了拼接sql语句的步骤,要比SqliteDatabase提供的insert,query,update,delete等函数效率高。当数据库越大,差别也越大。

?

? ? ?2.Sqlite数据库批量操作效率的问题

? ?应用程序初始化时需要批量的向sqlite中插入大量数据,单独的使用for+Insert方法导致应用响应缓慢,?因为? SQLite的数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很耗时的过程,会极大地影响数据库存取的速度。sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。初始5000条记录也就是要5000次读写磁盘操作,?将会重复的打开关闭数据库文件5000次,所以速度当然会很慢。而且不能保证所有数据都能同时插入。

?

? ? 解决方法:

? ? 添加事务处理,把5000条插入作为一个事务

? ? 我们使用SQLite的事务进行控制:

?

??? ??? db.beginTransaction();? //手动设置开始事务

??????? try{

??? ??? ??? //批量处理操作

??? ??? ??? for(Collection c:colls){

??? ??? ??? ??? insert(db, c);

??????????? }

??????????? db.setTransactionSuccessful(); //设置事务处理成功,不设置会自动回滚不提交。

//setTransactionSuccessfulendTransaction之间不进行任何数据库操作?

?????????? }catch(Exception e){

??? ??? ??? ?? MyLog.printStackTraceString(e);

??? ??? ?? }finally{

??? ??? ??? ?? db.endTransaction(); //处理完成

?????????? }

?

? ? 这样SQLite将把全部要执行的SQL语句先缓存在内存当中,然后等到COMMIT的时候一次性的写入数据库,这样数据库文件只被打开关闭了一次,效率自然大大的提高

?

?

  相关解决方案