Android批量插入數(shù)據(jù)
Android中在sqlite插入數(shù)據(jù)的時(shí)候默認(rèn)一條語句就是一個(gè)事務(wù)(All individual SQL Statements, (with rare exceptions like Bulk Inserts with No Log, or Truncate Table) are automaticaly "In a Transaction" whether you explicitly say so or not.. (even if they insert, update, or delete millions of rows).),因此如果存在上萬條數(shù)據(jù)插入的話,那就需要執(zhí)行上萬次插入操作,操作速度可想而知。因此在Android中插入數(shù)據(jù)時(shí),使用批量插入的方式可以大大提高插入速度。
批量插入的模板如下:
- public void inertOrUpdateDateBatch(List<String> sqls) {
- SQLiteDatabase db = getWritableDatabase();
- db.beginTransaction();
- try {
- for (String sql : sqls) {
- db.execSQL(sql);
- }
- // 設(shè)置事務(wù)標(biāo)志為成功,當(dāng)結(jié)束事務(wù)時(shí)就會(huì)提交事務(wù)
- db.setTransactionSuccessful();
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- // 結(jié)束事務(wù)
- db.endTransaction();
- db.close();
- }
- }
注意此處的:
- db.execSQL(sql);
官方的API顯示:
public void execSQL (String sql)
Execute a single SQL statement that is NOT a SELECT or any other SQL statement that returns data.
It has no means to return any data (such as the number of affected rows). Instead, you're encouraged to use insert(String, String, ContentValues)
, update(String, ContentValues, String, String[])
, et al, when possible.
When using enableWriteAheadLogging()
, journal_mode is automatically managed by this class. So, do not set journal_mode using "PRAGMA journal_mode'" statement if your app is using enableWriteAheadLogging()
Parameters
sql | the SQL statement to be executed. Multiple statements separated by semicolons are not supported. |
---|
Throws
SQLException | if the SQL string is invalid |
---|
說明,每次執(zhí)行SQL只能有一條語句。在執(zhí)行的時(shí)候,不能寫成:
- insert into student values('yang','boy');insert into student values('zhou','girl');
形式,而需要將兩條SQL語句拆開,每條SQL語句執(zhí)行一次。