Android批量插入数据

事务处理应用:很多时候我们需要批量的向Sqlite中插入大量数据时,单独的使用添加方法导致应用响应缓慢, 因为sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。

插入三千条数据对比
方法一:
不优化,直接一条一条插入(耗时:20s左右)

try {
                for (Area area : areas) {
                    Cursor cursor = null;
                    ContentValues cv;
                    cv = new ContentValues();
                    cv.put(TArea.CODE, area.getCode());
                    cv.put(TArea.CREATTIME, area.getCreatTime());
                    cv.put(TArea.FULLSPELL, area.getFullSpell());
                    cv.put(TArea.NAME, area.getName());
                    cv.put(TArea.SCOPE, area.getScope());
                    cv.put(TArea.SINGLESPELL, area.getSingleSpell());
                    cv.put(TArea.PARENT, area.getParent());
                    cursor = DbHelper.getInstance(context).query(TArea.TNAME, " where " + TArea.ID + "='" + area.getId() + "'");
                    if (cursor.getCount() == 0) {
                        DbHelper.getInstance(context).insert(TArea.TNAME, null, cv);
                    } else {
                        DbHelper.getInstance(context).update(TArea.TNAME, cv, TArea.ID + "=?", new String[]{String.valueOf(area.getId())});
                    }
                    cursor.close();
                }
            } catch (Exception e) {
                return false;
            }

方法二:
开事务(耗时:0s)

SQLiteDatabase db = DbHelper.getInstance(context).getWritableDatabase();

            try {
                // 如果该数据库表已经存在,先删掉
                String dropSql = "DROP TABLE IF EXISTS Area";
                db.execSQL(dropSql);
                // 重新创建数据库表
                String createSql = "CREATE TABLE IF NOT EXISTS Area(id INTEGER PRIMARY KEY, code TEXT, creatTime TEXT, fullspell TEXT, name TEXT, scope TEXT, singleSpell TEXT, parent TEXT)";
                db.execSQL(createSql);

                // 开启事务
                db.beginTransaction();

                // 往表名为"Area"的表里的code, creatTime, fullspell...等字段“开事务”批量“合并”插入
                String sql = "INSERT INTO Area(code, creatTime, fullspell, name, scope, singleSpell, parent) VALUES(?, ?, ?, ?, ?, ?, ?)";

                for (Area area : areas) {
                    db.execSQL(sql, new String[]{area.getCode(), String.valueOf(area.getCreatTime()),
                    area.getFullSpell(), area.getName(), area.getScope(), area.getSingleSpell(), area.getParent()});
                }

                //设置事务标志为成功,当结束事务时就会提交事务
                db.setTransactionSuccessful();
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            } finally {
                // 结束事务
                db.endTransaction();
            }

注意:
1.sqlite没有truncate,要清空表数据,只好先删表,再建表。
2.sqlite3数据库中并不支持bool型数据
3.不能直接插入多条记录,参考这里

INSERT INTO 'tablename' ('column1') VALUES
('val1'),
('val2'),
('val2'),
('val2');

需要转换成

public void diff_date(View v){
    SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd" );
    String insertRows = "INSERT INTO 'tablename' ('column1') VALUES";
     String date_in = sdf.format( dateAndTime .getTime() );
     String date_out = sdf.format( dateAndTime1.getTime() );
     int differenza_date = Days.daysBetween(new DateTime(date_in), new DateTime(date_out)).getDays();
     for(int i=1 ; i < differenza_date ; i++)
     {
         // increase i day each time and save it in string 
         insertRows += "("+increasedDate+"),"
     }

     // and here insert into database 
     db.execSQL(insertRows)
     }

你可能感兴趣的:(Android)