sqlite插入速度优化方案

前端之家收集整理的这篇文章主要介绍了sqlite插入速度优化方案前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。



先贴上sqliteOpenHelper的代码,我们创建测试的表是user,它有四个字段id,name,age,height,remark,测试用的小米2,默认条数为100行。


[java] view plain copy
  1. //MysqLiteOpenHelper作为一个访问sqlite的帮助类,提供两方面的功能
  2. //1.getReadableDatabase(),getWritableDatabase()可以获得sqliteDatatbase对象,
  3. //对这个对象进行相关操作
  4. //2.提供了onCreate()和onUpgrade()两个回调函数,允许我们在创建和升级数据库时进行操作
  5. publicclassMysqLiteOpenHelperextendssqliteOpenHelper{
  6. staticfinalStringDATABASE_NAME="test.db";
  7. finalStringTAG="MysqLiteOpenHelper";
  8. publicMysqLiteOpenHelper(Contextcontext){
  9. this(context,DATABASE_NAME,null,1);
  10. }
  11. publicMysqLiteOpenHelper(Contextcontext,153); background-color:inherit; font-weight:bold">intversion){
  12. //必须要有这一个构造方法
  13. CursorFactoryfactory,super(context,factory,0); background-color:inherit">//TODOAuto-generatedconstructorstub
  14. }
  15. //当数据库第一次创建的时候被调用,0); background-color:inherit">//当调用getReadableDatabase()或getWritableDatabase的时候
  16. @Override
  17. voidonCreate(sqliteDatabasedb){
  18. //TODOAuto-generatedmethodstub
  19. Log.d(TAG,"onCreate");
  20. Stringsql="createtableuser(idintegerprimarykeyautoincrement,"
  21. +"namevarchar(20),"+"ageinteger,"+"heightlong,"
  22. +"remarkvarchar(12))";
  23. db.execsql(sql);
  24. voidclose(){
  25. sqliteDatabasedb=this.getWritableDatabase();
  26. db.execsql("droptableuser");
  27. voidonUpgrade(sqliteDatabasedb,153); background-color:inherit; font-weight:bold">intoldVersion,153); background-color:inherit; font-weight:bold">intnewVersion){
  28. "onUpgrade");
  29. }


1。使用ContentValues插入。完成时间:4805493666(纳秒)

copy
    /**
  1. *ContentValues方式
  2. *
  3. *@paramsum
  4. *@return
  5. */
  6. longinsert1(intsum){
  7. longbefore=System.nanoTime();
  8. MysqLiteOpenHelperdbHelper=newMysqLiteOpenHelper(MainActivity.this);
  9. //得到数据库对象
  10. sqliteDatabasedb=dbHelper.getWritableDatabase();
  11. for(inti=0;i<sum;i++){
  12. ContentValuescv=newContentValues();
  13. cv.put("name","zhangsan");
  14. cv.put("age","23");
  15. cv.put("height",0); background-color:inherit">1.78);
  16. cv.put("remark","无");
  17. db.insert("user",cv);
  18. db.close();
  19. longafter=System.nanoTime();
  20. returnafter-before;
  21. }

2。使用基本slq语句插入。完成时间:3734808485(纳秒)

copy
    longinsert2(0;i<sum;i++){
  1. Stringsql="insertintouser(name,remark)values('zhangsan',23,1.78,'无')";
  2. db.execsql(sql);
  3. longafter=System.nanoTime();
  4. returnafter-before;
  5. }

3。使用sqlliteStatement插入。完成时间:4754616203(纳秒)

copy
    longinsert3( MysqLiteOpenHelperdbHelper=this);
  1. //得到数据库对象
  2. sqliteDatabasedb=dbHelper.getWritableDatabase();
  3. Stringsql="insertintouser(name,remark)values(?,?,?)";
  4. sqliteStatementstmt=db.compileStatement(sql);
  5. stmt.clearBindings();
  6. stmt.bindString(1,"zhangsan");
  7. stmt.bindLong(2,0); background-color:inherit">23);
  8. stmt.bindLong(3,0); background-color:inherit">178);
  9. stmt.bindString(4,"无");
  10. stmt.execute();
  11. }

4。使用一次插入多条的方式。完成时间:245414315(纳秒)

copy
    longinsert4(0;i<sum/10;i++){
  1. +"('zhangsan',248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> +"('zhangsan','无')";
  2. db.close();
  3. }

5.使用事务处理插入方式。完成时间:229787881(纳秒)

copy
    longinsert5( db.beginTransaction();
  1. db.setTransactionSuccessful();
  2. db.endTransaction();
  3. }

清楚起见,排列时间如下:
4805493666
3734808485
4754616203
245414315
229787881
由此可见,使用事务处理和一次插入多条的插入方式所用时间最少!而且差了一个数量级!

转载自:http://www.jb51.cc/article/p-fezfswdx-hq.html

原文链接:https://www.f2er.com/sqlite/201108.html

猜你在找的Sqlite相关文章