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); } }]; } }); }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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