【iOS開發-105】SQLite第三方架構FMDB的使用,以及使用FMDatabaseQueue保證安全執行緒

來源:互聯網
上載者:User

標籤:

(1):https://github.com/ccgus/fmdb


(2)注意點

——語句可以帶分號“;”,也可以省略分號。

——同樣需要添加“libsqlite3.dylib”庫才能使用。

——移動端的開發中,一般不關閉資料庫,即不怎麼使用[self.db close];,因為每次重新開啟比較耗效能,且每次程式關閉時資料庫自然會同時關閉。


(3)用法

#import "ViewController.h"#import "FMDB.h"@interface ViewController ()@property(nonatomic,strong) FMDatabase *db;- (IBAction)insert:(id)sender;- (IBAction)delete:(id)sender;- (IBAction)update:(id)sender;- (IBAction)select:(id)sender;@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    NSString *filePath=[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"fmdb.sqlite"];    //建立資料庫    self.db=[FMDatabase databaseWithPath:filePath];    //開啟資料庫    if ([self.db open]) {        NSLog(@"開啟資料庫成功");        //建立表格,除了select外,所有的操作都是更新        BOOL createTableResult=[self.db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT,name text,age integer)"];        if (createTableResult) {            NSLog(@"建立表成功");        }else{            NSLog(@"建立表失敗");        }    }else{        NSLog(@"開啟資料庫失敗");    }}- (IBAction)insert:(id)sender {    for (int index=0; index<50; index++) {        NSString *s_name=[NSString stringWithFormat:@"Andy%d",arc4random()%100];        NSNumber *[email protected](arc4random()%100);        [self.db executeUpdate:@"INSERT INTO t_student(name,age) VALUES(?,?)",s_name,s_age];    }}- (IBAction)delete:(id)sender {    [self.db executeUpdate:@"DELETE FROM t_student WHERE id=?",@1];}- (IBAction)update:(id)sender {    [self.db executeUpdate:@"UPDATE t_student SET name='Jack' WHERE id=?",@2];}- (IBAction)select:(id)sender {    //擷取結果集,返回參數就是查詢結果    FMResultSet *rs=[self.db executeQuery:@"SELECT * FROM t_student WHERE age>?",@50];    while ([rs next]) {        int ID=[rs intForColumn:@"id"];        NSString *NAME=[rs stringForColumn:@"name"];        int AGE=[rs intForColumn:@"age"];        NSLog(@"%d %@ %d",ID,NAME,AGE);    }}@end

(4)使用FMDatabaseQueue保證安全執行緒(建議以後都這麼做)

——主要就是在建立資料庫的時候,預設已經開啟資料庫

——隨後的很多操作,因為需要在資料庫中操作,所以需要利用隊列的inDataBase方法調出資料庫,在block中執行作業碼。

#import "ViewController.h"#import "FMDB.h"@interface ViewController ()@property(nonatomic,strong) FMDatabaseQueue *queue;- (IBAction)insert:(id)sender;- (IBAction)delete:(id)sender;- (IBAction)update:(id)sender;- (IBAction)select:(id)sender;@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    NSString *filePath=[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"fmdb.sqlite"];    //建立資料庫,並加入到隊列中,此時已經預設開啟了資料庫,無須手動開啟,只需要從隊列中去除資料庫即可    self.queue=[FMDatabaseQueue databaseQueueWithPath:filePath];    //取出資料庫,這裡的db就是資料庫,在資料庫中建立表    [self.queue inDatabase:^(FMDatabase *db) {        //建立表        BOOL createTableResult=[db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT,name text,age integer)"];        if (createTableResult) {            NSLog(@"建立表成功");        }else{            NSLog(@"建立表失敗");        }    }];}- (IBAction)insert:(id)sender {    [self.queue inDatabase:^(FMDatabase *db) {        for (int index=0; index<50; index++) {            NSString *s_name=[NSString stringWithFormat:@"Andy%d",arc4random()%100];            NSNumber *[email protected](arc4random()%100);            [db executeUpdate:@"INSERT INTO t_student(name,age) VALUES(?,?)",s_name,s_age];        }    }];}- (IBAction)delete:(id)sender {    [self.queue inDatabase:^(FMDatabase *db) {        [db executeUpdate:@"DELETE FROM t_student WHERE id=?",@1];    }];}- (IBAction)update:(id)sender {    [self.queue inDatabase:^(FMDatabase *db) {        [db executeUpdate:@"UPDATE t_student SET name='Jack' WHERE id=?",@2];    }];}- (IBAction)select:(id)sender {    [self.queue inDatabase:^(FMDatabase *db) {        //擷取結果集,返回參數就是查詢結果        FMResultSet *rs=[db executeQuery:@"SELECT * FROM t_student WHERE age>?",@50];        while ([rs next]) {            int ID=[rs intForColumn:@"id"];            NSString *NAME=[rs stringForColumn:@"name"];            int AGE=[rs intForColumn:@"age"];            NSLog(@"%d %@ %d",ID,NAME,AGE);        }    }];}

(5)如果要保證多個操作同時成功或者同時失敗,用事務,即把多個操作放在同一個事務中。

——FMDB中,拿到資料庫直接操作事務,如下:

- (IBAction)update:(id)sender {    [self.queue inDatabase:^(FMDatabase *db) {        [db beginTransaction];        [db executeUpdate:@"UPDATE t_student SET name='Jack' WHERE id=?",@2];        [db executeUpdate:@"UPDATE t_student SET name='Tomy' WHERE id=?",@3];        //發現情況不對時,主動復原用下面語句。否則是根據commit結果,如成功就成功,如不成功才復原        [db rollback];        [db executeUpdate:@"UPDATE t_student SET name='Eric' WHERE id=?",@4];        [db commit];    }];}

上面因為用的是FMDB封裝好的,其實原生的代碼是這樣的:

[db executeUpdate:@"BEGIN TRANSACTION"];[db executeUpdate:@"ROLLBACK TRANSACTION"];[db executeUpdate:@"COMMIT TRANSACTION"];

——FMDB中,也可以直接利用隊列進行事務操作,隊列中的開啟、關閉、復原事務等都已經被封裝好了。

- (IBAction)update:(id)sender {    [self.queue inDatabase:^(FMDatabase *db) {        [self.queue inTransaction:^(FMDatabase *db, BOOL *rollback) {            [db executeUpdate:@"UPDATE t_student SET name='Jack' WHERE id=?",@2];            [db executeUpdate:@"UPDATE t_student SET name='Tomy' WHERE id=?",@3];            //發現情況不對時,主動復原用下面語句。            *rollback=YES;            [db executeUpdate:@"UPDATE t_student SET name='Eric' WHERE id=?",@4];        }];}


【iOS開發-105】SQLite第三方架構FMDB的使用,以及使用FMDatabaseQueue保證安全執行緒

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.