Android--批量插入数据到SQLite数据库

Android中在sqlite插入数据的时候默认一条语句就是一个事务,因此如果存在上万条数据插入的话,那就需要执行上万次插入操作,操作速度可想而知。因此在Android中插入数据时,使用批量插入的方式可以大大提高插入速度。
  有时需要把一些数据内置到应用中,常用的有以下几种方式:
1、使用db.execSQL(sql)
  这里是把要插入的数据拼接成可执行的sql语句,然后调用db.execSQL(sql)方法执行插入。
[java]  view plain  copy
 print ?
  1. public void inertOrUpdateDateBatch(List<String> sqls) {  
  2. SQLiteDatabase db = getWritableDatabase();  
  3. db.beginTransaction();  
  4. try {  
  5. for (String sql : sqls) {  
  6. db.execSQL(sql);  
  7. }  
  8. // 设置事务标志为成功,当结束事务时就会提交事务  
  9. db.setTransactionSuccessful();  
  10. catch (Exception e) {  
  11. e.printStackTrace();  
  12. finally {  
  13. // 结束事务  
  14. db.endTransaction();  
  15. db.close();  
  16. }  
  17. }  

2、使用db.insert("table_name", null, contentValues)
  这里是把要插入的数据封装到ContentValues类中,然后调用db.insert()方法执行插入。
[java]  view plain  copy
 print ?
  1. db.beginTransaction(); // 手动设置开始事务  
  2. for (ContentValues v : list) {  
  3. db.insert("bus_line_station"null, v);  
  4. }  
  5. db.setTransactionSuccessful(); // 设置事务处理成功,不设置会自动回滚不提交  
  6. db.endTransaction(); // 处理完成  
  7. db.close()  
3、使用InsertHelper类
  这个类在API 17中已经被废弃了
[java]  view plain  copy
 print ?
  1. InsertHelper ih = new InsertHelper(db, "bus_line_station");  
  2. db.beginTransaction();  
  3. final int directColumnIndex = ih.getColumnIndex("direct");  
  4. final int lineNameColumnIndex = ih.getColumnIndex("line_name");  
  5. final int snoColumnIndex = ih.getColumnIndex("sno");  
  6. final int stationNameColumnIndex = ih.getColumnIndex("station_name");  
  7. try {  
  8. for (Station s : busLines) {  
  9. ih.prepareForInsert();  
  10. ih.bind(directColumnIndex, s.direct);  
  11. ih.bind(lineNameColumnIndex, s.lineName);  
  12. ih.bind(snoColumnIndex, s.sno);  
  13. ih.bind(stationNameColumnIndex, s.stationName);  
  14. ih.execute();  
  15. }  
  16. db.setTransactionSuccessful();  
  17. finally {  
  18. ih.close();  
  19. db.endTransaction();  
  20. db.close();  
  21. }  


4、使用SQLiteStatement
  查看InsertHelper时,官方文档提示改类已经废弃,请使用SQLiteStatement
[java]  view plain  copy
 print ?
  1. String sql = "insert into bus_line_station(direct,line_name,sno,station_name) values(?,?,?,?)";  
  2. SQLiteStatement stat = db.compileStatement(sql);  
  3. db.beginTransaction();  
  4. for (Station line : busLines) {  
  5. stat.bindLong(1, line.direct);  
  6. stat.bindString(2, line.lineName);  
  7. stat.bindLong(3, line.sno);  
  8. stat.bindString(4, line.stationName);  
  9. stat.executeInsert();  
  10. }  
  11. db.setTransactionSuccessful();  
  12. db.endTransaction();  
  13. db.close();  

第三种方法需要的时间最短,鉴于该类已经在API17中废弃,所以第四种方法应该是最优的方法。

猜你喜欢

转载自blog.csdn.net/cry_smile_hate/article/details/79261912