Android--批量插入数据到SQLite数据库
生活随笔
收集整理的這篇文章主要介紹了
Android--批量插入数据到SQLite数据库
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Android中在sqlite插入數據的時候默認一條語句就是一個事務,因此如果存在上萬條數據插入的話,那就需要執行上萬次插入操作,操作速度可想而知。因此在Android中插入數據時,使用批量插入的方式可以大大提高插入速度。 有時需要把一些數據內置到應用中,常用的有以下幾種方式: 1、使用db.execSQL(sql) 這里是把要插入的數據拼接成可執行的sql語句,然后調用db.execSQL(sql)方法執行插入。 public void inertOrUpdateDateBatch(List<String> sqls) {
SQLiteDatabase db = getWritableDatabase();
db.beginTransaction();
try {
for (String sql : sqls) {
db.execSQL(sql);
}
// 設置事務標志為成功,當結束事務時就會提交事務
db.setTransactionSuccessful();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 結束事務
db.endTransaction();
db.close();
}
}
2、使用db.insert("table_name", null, contentValues) 這里是把要插入的數據封裝到ContentValues類中,然后調用db.insert()方法執行插入。 db.beginTransaction(); // 手動設置開始事務 for (ContentValues v : list) { db.insert("bus_line_station", null, v); } db.setTransactionSuccessful(); // 設置事務處理成功,不設置會自動回滾不提交 db.endTransaction(); // 處理完成 db.close() 3、使用InsertHelper類 這個類在API 17中已經被廢棄了 InsertHelper ih = new InsertHelper(db, "bus_line_station"); db.beginTransaction(); final int directColumnIndex = ih.getColumnIndex("direct"); final int lineNameColumnIndex = ih.getColumnIndex("line_name"); final int snoColumnIndex = ih.getColumnIndex("sno"); final int stationNameColumnIndex = ih.getColumnIndex("station_name"); try { for (Station s : busLines) { ih.prepareForInsert(); ih.bind(directColumnIndex, s.direct); ih.bind(lineNameColumnIndex, s.lineName); ih.bind(snoColumnIndex, s.sno); ih.bind(stationNameColumnIndex, s.stationName); ih.execute(); } db.setTransactionSuccessful(); } finally { ih.close(); db.endTransaction(); db.close(); }
4、使用SQLiteStatement 查看InsertHelper時,官方文檔提示改類已經廢棄,請使用SQLiteStatement String sql = "insert into bus_line_station(direct,line_name,sno,station_name) values(?,?,?,?)"; SQLiteStatement stat = db.compileStatement(sql); db.beginTransaction(); for (Station line : busLines) { stat.bindLong(1, line.direct); stat.bindString(2, line.lineName); stat.bindLong(3, line.sno); stat.bindString(4, line.stationName); stat.executeInsert(); } db.setTransactionSuccessful(); db.endTransaction(); db.close();
第三種方法需要的時間最短,鑒于該類已經在API17中廢棄,所以第四種方法應該是最優的方法。
2、使用db.insert("table_name", null, contentValues) 這里是把要插入的數據封裝到ContentValues類中,然后調用db.insert()方法執行插入。 db.beginTransaction(); // 手動設置開始事務 for (ContentValues v : list) { db.insert("bus_line_station", null, v); } db.setTransactionSuccessful(); // 設置事務處理成功,不設置會自動回滾不提交 db.endTransaction(); // 處理完成 db.close() 3、使用InsertHelper類 這個類在API 17中已經被廢棄了 InsertHelper ih = new InsertHelper(db, "bus_line_station"); db.beginTransaction(); final int directColumnIndex = ih.getColumnIndex("direct"); final int lineNameColumnIndex = ih.getColumnIndex("line_name"); final int snoColumnIndex = ih.getColumnIndex("sno"); final int stationNameColumnIndex = ih.getColumnIndex("station_name"); try { for (Station s : busLines) { ih.prepareForInsert(); ih.bind(directColumnIndex, s.direct); ih.bind(lineNameColumnIndex, s.lineName); ih.bind(snoColumnIndex, s.sno); ih.bind(stationNameColumnIndex, s.stationName); ih.execute(); } db.setTransactionSuccessful(); } finally { ih.close(); db.endTransaction(); db.close(); }
4、使用SQLiteStatement 查看InsertHelper時,官方文檔提示改類已經廢棄,請使用SQLiteStatement String sql = "insert into bus_line_station(direct,line_name,sno,station_name) values(?,?,?,?)"; SQLiteStatement stat = db.compileStatement(sql); db.beginTransaction(); for (Station line : busLines) { stat.bindLong(1, line.direct); stat.bindString(2, line.lineName); stat.bindLong(3, line.sno); stat.bindString(4, line.stationName); stat.executeInsert(); } db.setTransactionSuccessful(); db.endTransaction(); db.close();
第三種方法需要的時間最短,鑒于該類已經在API17中廢棄,所以第四種方法應該是最優的方法。
轉載于:https://www.cnblogs.com/chaoyu/p/6436784.html
總結
以上是生活随笔為你收集整理的Android--批量插入数据到SQLite数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kvc error
- 下一篇: Android 使用内置的Camera应