iOS 使用FMDB事務(wù)批量更新數(shù)據(jù)庫

當(dāng)談到“事務(wù)”時诗赌,我想到了sqlite本身是支持事務(wù)操作的靠闭,F(xiàn)MDB作為sqlite的上層封裝也對事務(wù)進(jìn)行了支持,那么說了這么多給不了解“事務(wù)”這個詞的同學(xué)解釋一下吧:通常一次 sqlite3_exec 就是一次事務(wù),假如你要對數(shù)據(jù)庫中的Stutent表插入新數(shù)據(jù)惫霸,那么該事務(wù)的具體過程是:開始新事物->插入數(shù)據(jù)->提交事務(wù)扛拨,那么當(dāng)我們要往該表內(nèi)插入500條數(shù)據(jù)耘分,如果按常規(guī)操作處理就要執(zhí)行500次“開始新事物->插入數(shù)據(jù)->提交事務(wù)”的過程。

好吧绑警,今天的重點(diǎn)來了,舉個例子:假如北京的一家A工廠接了上海一家B公司的500件產(chǎn)品的訂單求泰,思考一下:A工廠是生產(chǎn)完一件立即就送到B公司還是將500件產(chǎn)品全部生產(chǎn)完成后再送往B公司?答案肯定是后者计盒,因為前者浪費(fèi)了大量的時間渴频、人力物力花費(fèi)在往返于北京和上海之間。同樣這個道理也能用在我們的數(shù)據(jù)庫操作上北启,下面是我自己對使用事務(wù)和不使用事務(wù)的兩種測試:

測試代碼:

下面代碼中總共調(diào)用了三次插入數(shù)據(jù)的方法卜朗,由于第一次調(diào)用過程中包含數(shù)據(jù)庫和表的創(chuàng)建等一系列過程拔第,因此第二三次調(diào)用插入方法計算出的時間才是準(zhǔn)確的。(數(shù)據(jù)庫采用FMDB)

 [[TestDataBase sharedInstanceDB] insertData:0 useTransaction:NO];
    NSDate *date1 = [NSDate date];
    [[TestDataBase sharedInstanceDB] insertData:500 useTransaction:NO];
    NSDate *date2 = [NSDate date];
    NSTimeInterval a = [date2 timeIntervalSince1970] - [date1 timeIntervalSince1970];
    NSLog(@"不使用事務(wù)插入500條數(shù)據(jù)用時%.3f秒",a);

    [[TestDataBase sharedInstanceDB] insertData:1000 useTransaction:YES];
    NSDate *date3 = [NSDate date];
    NSTimeInterval b = [date3 timeIntervalSince1970] - [date2 timeIntervalSince1970];
    NSLog(@"使用事務(wù)插入500條數(shù)據(jù)用時%.3f秒",b);

下面是具體的插入實現(xiàn)方法场钉,
useTransaction為真代表使用事務(wù)處理蚊俺,反之不使用

- (void)insertData:(int)fromIndex useTransaction:(BOOL)useTransaction
{
    [_dataBase open];

    if (useTransaction) {
        [_dataBase beginTransaction];
        BOOL isRollBack = NO;
        @try {
            for (int i = fromIndex; i<500+fromIndex; i++) {
                NSString *nId = [NSString stringWithFormat:@"%d",i];
                NSString *strName = [[NSString alloc] initWithFormat:@"student_%d",i];
                NSString *sql = @"INSERT INTO Student (id,student_name) VALUES (?,?)";
                BOOL a = [_dataBase executeUpdate:sql,nId,strName];
                if (!a) {
                    NSLog(@"插入失敗1");
                }
            }
        }
        @catch (NSException *exception) {
            isRollBack = YES;
            [_dataBase rollback];
        }
        @finally {
            if (!isRollBack) {
                [_dataBase commit];
            }
        }
    }else{
        for (int i = fromIndex; i<500+fromIndex; i++) {
            NSString *nId = [NSString stringWithFormat:@"%d",i];
            NSString *strName = [[NSString alloc] initWithFormat:@"student_%d",i];
            NSString *sql = @"INSERT INTO Student (id,student_name) VALUES (?,?)";
            BOOL a = [_dataBase executeUpdate:sql,nId,strName];
            if (!a) {
                NSLog(@"插入失敗2");
            }
        }
    }
    [_dataBase close];
}

從上面這些真實的數(shù)據(jù)來看,你就應(yīng)該知道當(dāng)你批量更新數(shù)據(jù)庫的時候應(yīng)該利用事務(wù)處理逛万!

總結(jié):使用事務(wù)處理就是將所有任務(wù)執(zhí)行完成以后將結(jié)果一次性提交到數(shù)據(jù)庫泳猬,如果此過程出現(xiàn)異常則會執(zhí)行回滾操作,這樣節(jié)省了大量的重復(fù)提交環(huán)節(jié)所浪費(fèi)的時間

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泣港,一起剝皮案震驚了整個濱河市暂殖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌当纱,老刑警劉巖呛每,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異坡氯,居然都是意外死亡晨横,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門箫柳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來手形,“玉大人,你說我怎么就攤上這事悯恍】饪罚” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵涮毫,是天一觀的道長瞬欧。 經(jīng)常有香客問我,道長罢防,這世上最難降的妖魔是什么艘虎? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮咒吐,結(jié)果婚禮上野建,老公的妹妹穿的比我還像新娘。我一直安慰自己恬叹,他們只是感情好候生,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著妄呕,像睡著了一般陶舞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绪励,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天肿孵,我揣著相機(jī)與錄音,去河邊找鬼疏魏。 笑死停做,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的大莫。 我是一名探鬼主播蛉腌,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼只厘!你這毒婦竟也來了烙丛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤羔味,失蹤者是張志新(化名)和其女友劉穎河咽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赋元,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡忘蟹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了搁凸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媚值。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖护糖,靈堂內(nèi)的尸體忽然破棺而出褥芒,到底是詐尸還是另有隱情,我是刑警寧澤嫡良,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布锰扶,位于F島的核電站,受9級特大地震影響皆刺,放射性物質(zhì)發(fā)生泄漏少辣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一羡蛾、第九天 我趴在偏房一處隱蔽的房頂上張望漓帅。 院中可真熱鬧,春花似錦痴怨、人聲如沸忙干。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捐迫。三九已至,卻和暖如春爱葵,著一層夾襖步出監(jiān)牢的瞬間施戴,已是汗流浹背反浓。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赞哗,地道東北人雷则。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像肪笋,于是被迫代替她去往敵國和親月劈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容