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. public class MySQLiteOpenHelper extends SQLiteOpenHelper {  
  6.   
  7.     public static final String DATABASE_NAME = "test.db";  
  8.   
  9.     public static final String TAG = "MySQLiteOpenHelper";  
  10.   
  11.     public MySQLiteOpenHelper(Context context) {  
  12.         this(context, DATABASE_NAME, null1);  
  13.     }  
  14.   
  15.     public MySQLiteOpenHelper(Context context, int version) {  
  16.         this(context, DATABASE_NAME, null, version);  
  17.     }  
  18.   
  19.     // 必须要有这一个构造方法  
  20.     public MySQLiteOpenHelper(Context context, String name,  
  21.             CursorFactory factory, int version) {  
  22.         super(context, name, factory, version);  
  23.         // TODO Auto-generated constructor stub  
  24.     }  
  25.   
  26.     // 当数据库第一次创建的时候被调用,  
  27.     // 当调用getReadableDatabase ()或getWritableDatabase 的时候  
  28.     @Override  
  29.     public void onCreate(SQLiteDatabase db) {  
  30.         // TODO Auto-generated method stub  
  31.         Log.d(TAG, "onCreate");  
  32.   
  33.         String sql = "create table user(id integer primary key autoincrement,"  
  34.                 + "name varchar(20)," + "age integer," + "height long,"  
  35.                 + "remark varchar(12))";  
  36.         db.execSQL(sql);  
  37.     }  
  38.   
  39.     public void close() {  
  40.         SQLiteDatabase db = this.getWritableDatabase();  
  41.         db.execSQL("drop table user");  
  42.     }  
  43.   
  44.     @Override  
  45.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  46.         // TODO Auto-generated method stub  
  47.         Log.d(TAG, "onUpgrade");  
  48.     }  
  49.   
  50. }  


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

[java]  view plain copy
  1. /** 
  2.  * ContentValues方式 
  3.  *  
  4.  * @param sum 
  5.  * @return 
  6.  */  
  7. public long insert1(int sum) {  
  8.     long before = System.nanoTime();  
  9.   
  10.     MySQLiteOpenHelper dbHelper = new MySQLiteOpenHelper(MainActivity.this);  
  11.     // 得到数据库对象  
  12.     SQLiteDatabase db = dbHelper.getWritableDatabase();  
  13.   
  14.     for (int i = 0; i < sum; i++) {  
  15.         ContentValues cv = new ContentValues();  
  16.         cv.put("name""zhangsan");  
  17.         cv.put("age""23");  
  18.         cv.put("height"1.78);  
  19.         cv.put("remark""无");  
  20.         db.insert("user"null, cv);  
  21.     }  
  22.   
  23.     db.close();  
  24.     long after = System.nanoTime();  
  25.     return after - before;  
  26.   
  27. }  

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

[java]  view plain copy
  1. public long insert2(int sum) {  
  2.         long before = System.nanoTime();  
  3.   
  4.         MySQLiteOpenHelper dbHelper = new MySQLiteOpenHelper(MainActivity.this);  
  5.         // 得到数据库对象  
  6.         SQLiteDatabase db = dbHelper.getWritableDatabase();  
  7.         for (int i = 0; i < sum; i++) {  
  8.             String sql = "insert into user(name,age,height,remark) values('zhangsan',23,1.78,'无')";  
  9.             db.execSQL(sql);  
  10.         }  
  11.         db.close();  
  12.   
  13.         long after = System.nanoTime();  
  14.         return after - before;  
  15.     }  

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

[java]  view plain copy
  1. public long insert3(int sum) {  
  2.         long before = System.nanoTime();  
  3.         MySQLiteOpenHelper dbHelper = new MySQLiteOpenHelper(MainActivity.this);  
  4.         // 得到数据库对象  
  5.         SQLiteDatabase db = dbHelper.getWritableDatabase();  
  6.   
  7.         String sql = "insert into user(name,age,height,remark) values(?,?,?,?)";  
  8.         SQLiteStatement stmt = db.compileStatement(sql);  
  9.         for (int i = 0; i < sum; i++) {  
  10.             stmt.clearBindings();  
  11.             stmt.bindString(1"zhangsan");  
  12.             stmt.bindLong(223);  
  13.             stmt.bindLong(3178);  
  14.             stmt.bindString(4"无");  
  15.             stmt.execute();  
  16.         }  
  17.         db.close();  
  18.   
  19.         long after = System.nanoTime();  
  20.         return after - before;  
  21.     }  

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

[java]  view plain copy
  1. public long insert4(int sum) {  
  2.         long before = System.nanoTime();  
  3.   
  4.         MySQLiteOpenHelper dbHelper = new MySQLiteOpenHelper(MainActivity.this);  
  5.         // 得到数据库对象  
  6.         SQLiteDatabase db = dbHelper.getWritableDatabase();  
  7.         for (int i = 0; i < sum / 10; i++) {  
  8.             String sql = "insert into user(name,age,height,remark) values('zhangsan',23,1.78,'无'),"  
  9.                     + "('zhangsan',23,1.78,'无'),"  
  10.                     + "('zhangsan',23,1.78,'无'),"  
  11.                     + "('zhangsan',23,1.78,'无'),"  
  12.                     + "('zhangsan',23,1.78,'无'),"  
  13.                     + "('zhangsan',23,1.78,'无'),"  
  14.                     + "('zhangsan',23,1.78,'无'),"  
  15.                     + "('zhangsan',23,1.78,'无'),"  
  16.                     + "('zhangsan',23,1.78,'无'),"  
  17.                     + "('zhangsan',23,1.78,'无')";  
  18.             db.execSQL(sql);  
  19.         }  
  20.         db.close();  
  21.   
  22.         long after = System.nanoTime();  
  23.         return after - before;  
  24.     }  

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

[java]  view plain copy
  1. public long insert5(int sum) {  
  2.         long before = System.nanoTime();  
  3.   
  4.         MySQLiteOpenHelper dbHelper = new MySQLiteOpenHelper(MainActivity.this);  
  5.         // 得到数据库对象  
  6.         SQLiteDatabase db = dbHelper.getWritableDatabase();  
  7.         db.beginTransaction();  
  8.         for (int i = 0; i < sum; i++) {  
  9.             String sql = "insert into user(name,age,height,remark) values('zhangsan',23,1.78,'无')";  
  10.             db.execSQL(sql);  
  11.         }  
  12.         db.setTransactionSuccessful();  
  13.         db.endTransaction();  
  14.         db.close();  
  15.   
  16.         long after = System.nanoTime();  
  17.         return after - before;  
  18.     }  

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

转载自:http://blog.csdn.net/ihrthk/article/details/8741047


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值