標籤:
(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保證安全執行緒