SQLite批量插入Android代码示例

来源:互联网 发布:软件被劫持 编辑:程序博客网 时间:2024/06/04 22:47
   参考之前博文:《如何向SQLite批量插入大量记录和其他一些使用心得》
------------------------------代码的分割线---------------------------
importandroid.database.sqlite.SQLiteDatabase;
importandroid.database.sqlite.SQLiteStatement;

public class SQLiteBatchUpdateTool{

private static final String TAG ="SQLiteBatchUpdateTool";

public static interfaceBatchOperateDataSource {
  public intsize();
  public booleannext();
  public voidbindAllValues(SQLiteStatement statement);
}

public static booleanbatchInsertOrUpdate(String logMsg,
SQLiteHelper helper, String table,String[] columns,
BatchOperateDataSource dataSource){
  if (dataSource== null || dataSource.size() <= 0) {
   return false; // 没有数据无需更新
  }
  if (columns ==null || columns.length <= 0) {
   Log.e(TAG, logMsg + "传入的列值不正确,不能构造sql");
   return false;
  }
  Log.i(TAG,logMsg + "开始:记录数=" + dataSource.size());
  long start =System.currentTimeMillis();
  long failedCnt =0;
  long succCnt =0;
  boolean result =false;
  try {
   synchronized (helper) {
     SQLiteDatabase db =helper.getWritableDatabase();
     try {
      db.beginTransaction();
      StringBuilder sql = newStringBuilder();
      sql.append("INSERT OR REPLACEINTO ");
      sql.append(table);
      sql.append('(');

      int columnNum = 0;
      for (String colName : columns){
        sql.append((columnNum > 0) ? "," : "");
        sql.append(colName);
        ++columnNum;
      }
      sql.append(')');
      sql.append(" VALUES (");
      columnNum = 0;
      for (int i = 0; i <columns.length; i++) {
        sql.append((i > 0) ? ",?" : "?");
        ++columnNum;
      }
      sql.append(')');

      SQLiteStatement statement =db.compileStatement(sql.toString());
      while (dataSource.next()){
        dataSource.bindAllValues(statement);
        if (statement.executeInsert() != -1) {
          ++succCnt;
        } else {
          ++failedCnt;
        }
        statement.clearBindings();
      }
      result = true;
      db.setTransactionSuccessful();
     } catch (Exception e) {
     Log.e(TAG,logMsg + "执行数据库操作异常", e);
     result =false;
     } finally{
       if (db !=null) {
       try{
        db.endTransaction();
      } catch (Exception e) {
        Log.e(TAG, logMsg + "结束数据库事务异常", e);
      }
      try {
        db.close();
      } catch (Exception e) {
        Log.e(TAG, logMsg + "关闭数据库异常", e);
      }
     }
   }
  }
} finally {
  Log.i(TAG,logMsg + "结束:耗时=" + (System.currentTimeMillis() - start) +"ms,更新成功=" + succCnt + ",更新失败=" + failedCnt);
  }
return result;
}
}
0 0