<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

    Android批量插入數(shù)據(jù)到SQLite數(shù)據(jù)庫

    Android中在sqlite插入數(shù)據(jù)的時候默認一條語句就是一個事務(wù),因此如果存在上萬條數(shù)據(jù)插入的話,那就需要執(zhí)行上萬次插入操作,操作速度可想而知。因此在Android中插入數(shù)據(jù)時,使用批量插入的方式可以大大提高插入速度。
      有時需要把一些數(shù)據(jù)內(nèi)置到應(yīng)用中,常用的有以下2種方式:其一直接拷貝制作好的SQLite數(shù)據(jù)庫文件,其二是使用系統(tǒng)提供的數(shù)據(jù)庫,然后把數(shù)據(jù)批量插入。我更傾向于使用第二種方式:使用系統(tǒng)創(chuàng)建的數(shù)據(jù)庫,然后批量插入數(shù)據(jù)。批量插入數(shù)據(jù)也有很多方法,那么那種方法更快呢,下面通過一個demo比較一下各個方法的插入速度。
      1、使用db.execSQL(sql)
      這里是把要插入的數(shù)據(jù)拼接成可執(zhí)行的sql語句,然后調(diào)用db.execSQL(sql)方法執(zhí)行插入。
    public void inertOrUpdateDateBatch(List<String> sqls) {
    SQLiteDatabase db = getWritableDatabase();
    db.beginTransaction();
    try {
    for (String sql : sqls) {
    db.execSQL(sql);
    }
    // 設(shè)置事務(wù)標志為成功,當結(jié)束事務(wù)時就會提交事務(wù)
    db.setTransactionSuccessful();
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    // 結(jié)束事務(wù)
    db.endTransaction();
    db.close();
    }
    }
      2、使用db.insert("table_name", null, contentValues)
      這里是把要插入的數(shù)據(jù)封裝到ContentValues類中,然后調(diào)用db.insert()方法執(zhí)行插入。
    db.beginTransaction(); // 手動設(shè)置開始事務(wù)
    for (ContentValues v : list) {
    db.insert("bus_line_station", null, v);
    }
    db.setTransactionSuccessful(); // 設(shè)置事務(wù)處理成功,不設(shè)置會自動回滾不提交
    db.endTransaction(); // 處理完成
    db.close()
    3、使用InsertHelper類
      這個類在API 17中已經(jīng)被廢棄了
    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時,官方文檔提示改類已經(jīng)廢棄,請使用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();
      下圖是以上4中方法在批量插入1萬條數(shù)據(jù)消耗的時間
      可以發(fā)現(xiàn)第三種方法需要的時間最短,鑒于該類已經(jīng)在API17中廢棄,所以第四種方法應(yīng)該是最優(yōu)的方法。

    posted on 2014-05-23 10:12 順其自然EVO 閱讀(13940) 評論(0)  編輯  收藏 所屬分類: android

    <2014年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導(dǎo)航

    統(tǒng)計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲精选在线观看| 全免费一级午夜毛片| 亚洲无成人网77777| 亚洲精品中文字幕无乱码| 亚洲欧洲免费无码| 毛片a级毛片免费观看品善网| 青青草国产免费久久久下载| 亚洲一区二区免费视频| 四虎一区二区成人免费影院网址| 中文在线观看永久免费| 国产卡一卡二卡三免费入口| 相泽亚洲一区中文字幕| 一级女性全黄生活片免费看| 国产成人麻豆亚洲综合无码精品| 亚洲最大视频网站| 精品国产sm捆绑最大网免费站| 日韩精品在线免费观看| 亚洲中文字幕久久精品无码APP| A毛片毛片看免费| 亚洲精品国产品国语在线| 亚洲精品国产首次亮相| 久久午夜免费视频| 在线亚洲高清揄拍自拍一品区| 亚洲AV男人的天堂在线观看| 成人网站免费观看| 亚洲熟妇丰满多毛XXXX| 亚洲精品无码av中文字幕| 成人A级毛片免费观看AV网站| 涩涩色中文综合亚洲| 国产免费小视频在线观看| 国产亚洲日韩在线a不卡| 精品国产人成亚洲区| 丝袜捆绑调教视频免费区| 亚洲春色在线视频| 99精品视频免费观看| 亚洲av无码乱码国产精品fc2| 人妻丰满熟妇无码区免费| 亚洲av无码专区在线| 国产福利免费在线观看| 青青久久精品国产免费看| 久久精品亚洲男人的天堂|