FMDB使用介绍

最近公司要开发新项目,要使用到数据库,由于以前使用的较少,所以做下知识补充。
介绍

iOS中原生的SQLite API在使用上不好用,使用时非常不便。于是,就出现了一系列将SQLite API进行封装的代码库,例如FMDB、PlausibleDatabase、SQLitePersistentObjects等。

FMDB的使用

注意事项 :

使用 FMDB 先要导入系统库 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 数据库的类,用于执行 SQL 语句。

2.FMResultSet:用在FMDatabase中执行查询的结果的类。

3.FMDatabaseQueue:在多线程下查询和更新数据库用到的类。

数据库创建

FMDatabase是通过一个 SQLite 数据库文件路径创建的,此路径可以是以下三者之一:

1.一个文件的系统路径。磁盘中可以不存在此文件,因为如果不存在会自动为你创建。

2.一个空的字符串@""。会在临时位置创建一个空的数据库,当FMDatabase连接关闭时,该数据库会被删除。

3.NULL。会在内存中创建一个数据库,当FMDatabase连接关闭时,该数据库会被销毁

//引用头文件
#import"FMDatabase.h"
#import"FMDatabaseQueue.h"
//获取数据库文件的路径:
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"); } } 
}
// 插入数据 
- (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]; 
} 
}
// 更新数据
- (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]; 
} 
}
// 删除数据 
- (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]; 
}
}
// 查询数据 
- (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); } }]; } }); }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,898评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,401评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,058评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,539评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,382评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,319评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,706评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,370评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,664评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,715评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,476评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,326评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,730评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,003评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,275评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,683评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,877评论 2 335

推荐阅读更多精彩内容

  • 优秀的第三方库,README 也是很优秀的,理解了 README,会对使用带来很多便利。 ARC 和 MRC 项目...
    冷漠叻荭颜阅读 77,990评论 46 233
  • ARC 和 MRC 项目中使用 ARC 还是 MRC,对使用 FMDB 都没有任何影响,FMDB 会在编译项目时自...
    老傅_cac3阅读 237评论 0 1
  • FMDB简介iOS中原生的SQLite API在使用上相当不好用,在使用时,非常不便。于是,就出现了一系列将SQL...
    yi叶知秋阅读 1,404评论 1 3
  • 优秀的第三方库,README 也是很优秀的,理解了 README,会对使用带来很多便利。 ARC 和 MRC 项目...
    月上楼阁阅读 607评论 0 0
  • 1.CoreData 1.1 CoreData概述 1)Core data 是数据持久存储的最佳方式 2)Core...
    微春风阅读 3,777评论 0 10