加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

sqlite插入速度优化方案

发布时间:2020-12-12 20:13:25 所属栏目:百科 来源:网络整理
导读:先贴上SQLiteOpenHelper的代码,我们创建测试的表是user,它有四个字段id,name,age,height,remark,测试用的小米2,默认条数为100行。 [java] view plain copy //MySQliteOpenHelper作为一个访问SQLite的帮助类,提供两方面的功能 //1.getReadableDatabase(),



先贴上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.52php.cn/article/p-fezfswdx-hq.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读