最近公司要開發(fā)新項目昔馋,要使用到數(shù)據(jù)庫接校,由于以前使用的較少珊肃,所以做下知識補充。
介紹
iOS中原生的SQLite API在使用上不好用馅笙,使用時非常不便伦乔。于是,就出現(xiàn)了一系列將SQLite API進行封裝的代碼庫董习,例如FMDB烈和、PlausibleDatabase、SQLitePersistentObjects等皿淋。
FMDB的使用
注意事項 :
使用 FMDB 先要導入系統(tǒng)庫 libsqlite3.0.dylib
ARC工程添加MRC文件: -fno-objc-arc
MRC工程添加ARC文件: -fobjc-arc
如果一個工程為MRC,其中要添加ARC的文件:
選擇target - build phases - compile sources - 單擊ARC的文件將compiler flags設置為:-fobjc-arc
如果一個工程為ARC,其中要添加MRC的文件:
同樣的路徑招刹,然后單擊MRC的文件將compiler flags設置為:-fno-objc-arc
在 FMDB 中有三個重要的類:
1.FMDatabase:是一個提供 SQLite 數(shù)據(jù)庫的類恬试,用于執(zhí)行 SQL 語句。
2.FMResultSet:用在FMDatabase中執(zhí)行查詢的結果的類疯暑。
3.FMDatabaseQueue:在多線程下查詢和更新數(shù)據(jù)庫用到的類训柴。
數(shù)據(jù)庫創(chuàng)建
FMDatabase是通過一個 SQLite 數(shù)據(jù)庫文件路徑創(chuàng)建的,此路徑可以是以下三者之一:
1.一個文件的系統(tǒng)路徑妇拯。磁盤中可以不存在此文件幻馁,因為如果不存在會自動為你創(chuàng)建。
2.一個空的字符串@""越锈。會在臨時位置創(chuàng)建一個空的數(shù)據(jù)庫仗嗦,當FMDatabase連接關閉時,該數(shù)據(jù)庫會被刪除甘凭。
3.NULL稀拐。會在內存中創(chuàng)建一個數(shù)據(jù)庫,當FMDatabase連接關閉時丹弱,該數(shù)據(jù)庫會被銷毀
//引用頭文件
#import"FMDatabase.h"
#import"FMDatabaseQueue.h"
//獲取數(shù)據(jù)庫文件的路徑:
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *path = [doc stringByAppendingPathComponent:@"user.sqlite"]; self.dbPath = path;
// 建表
- (void)createTable {
NSLog(@"%s", __func__);
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:self.dbPath] == NO) {
// create it
FMDatabase *db = [FMDatabase databaseWithPath:self.dbPath];
if ([db open]) {
NSString *sql = @"CREATE TABLE 'User' ('id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , 'name' VARCHAR(30), 'password' VARCHAR(30))";
BOOL res = [db executeUpdate:sql]; if (!res) { NSLog(@"error when creating db table");
} else {
NSLog(@"success to creating db table");
}
[db close];
} else { NSLog(@"error when open db"); } }
}
// 插入數(shù)據(jù)
- (void)insertData {
NSLog(@"%s", __func__); static int idx = 1;
FMDatabase *db = [FMDatabase databaseWithPath:self.dbPath];
if ([db open]) { NSString *sql = @"insert into user (name, password) values(?, ?) ";
NSString *name = [NSString stringWithFormat:@"ZL%d", idx++];
BOOL res = [db executeUpdate:sql, name, @"girl"]; if (!res) {
NSLog(@"error to insert data");
} else {
NSLog(@"success to insert data");
ZLTestModel *model = [ZLTestModel modelWith:name id:idx];
[self.userArr addObject:model];
[self.tableView reloadData];
}
[db close];
}
}
// 更新數(shù)據(jù)
- (void)updateData { NSLog(@"%s", __func__);
FMDatabase *db = [FMDatabase databaseWithPath:self.dbPath];
if ([db open]) {
NSString *sql = @"UPDATE USER SET id = ? WHERE name = ?";
BOOL res = [db executeUpdate:sql, @"1", @"zl"];
if (!res) {
NSLog(@"error to UPDATE data");
} else { NSLog(@"success to UPDATE data"); [self queryData];
}
[db close];
}
}
// 刪除數(shù)據(jù)
- (void)deleteData { NSLog(@"%s", __func__); FMDatabase *db = [FMDatabase databaseWithPath:self.dbPath];
if ([db open]) {
NSString *sql = @"delete from user"; BOOL res = [db executeUpdate:sql];
if (!res) {
NSLog(@"error to delete db data");
} else {
NSLog(@"success to delete db data");
[self.userArr removeAllObjects];
[self.tableView reloadData];
}
[db close];
}
}
// 查詢數(shù)據(jù)
- (void)queryData {
NSLog(@"%s", __func__);
FMDatabase *db = [FMDatabase databaseWithPath:self.dbPath];
if ([db open]) { NSString *sql = @"select *from user"; FMResultSet *rs = [db executeQuery:sql];
while ([rs next]) {
int userId = [rs intForColumn:@"id"];
NSString *name = [rs stringForColumn:@"name"]; NSString *pass = [rs stringForColumn:@"password"]; NSLog(@"user id = %d, name = %@, pass = %@", userId, name, pass);
ZLTestModel *model = [ZLTestModel modelWith:name id:userId];
[self.userArr addObject:model];
[self.tableView reloadData]; }
[db close];
}
}
//multithread
- (void)multithread {
NSLog(@"%s", __func__); FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:self.dbPath];
dispatch_queue_t q1 = dispatch_queue_create("queue1", NULL);
dispatch_queue_t q2 = dispatch_queue_create("queue2", NULL);
dispatch_async(q1, ^{ for (int i = 0; i < 100; ++i) {
[queue inDatabase:^(FMDatabase *db) {
NSString *sql = @"insert into user (name, password) values(?, ?) ";
NSString *name = [NSString stringWithFormat:@"queue111 %d", i];
BOOL res = [db executeUpdate:sql, name, @"boy"];
if (!res) {
NSLog(@"error to add db data: %@", name);
} else {
NSLog(@"success to add db data: %@", name); } }]; } }); dispatch_async(q2, ^{ for (int i = 0; i < 100; ++i) {
[queue inDatabase:^(FMDatabase *db) {
NSString *sql = @"insert into user (name, password) values(?, ?) ";
NSString *name = [NSString stringWithFormat:@"queue222 %d", i];
BOOL res = [db executeUpdate:sql, name, @"boy"];
if (!res) {
NSLog(@"error to add db data: %@", name); } else { NSLog(@"success to add db data: %@", name); } }]; } }); }