IOS操作数据库,SQLite3和coredata是两个非常好的选择,但是对于我们这些掌握了其他数据库语言的人来说,使用这两中操作都 会觉得不方便,SQLite3使用起来太复杂了,而使用coredata的时候却封装太死了,我们需要自己些自己的数据库语句,这时候,FMDB就是一个 非常不错的选择!
什么是FMDB
FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API
FMDB的优点
使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码 对比苹果自带的Core Data框架,更加轻量级和灵活 提供了多线程安全的数据库操作方法,有效地防止数据混乱
FMDB有三个主要的类
①FMDatabase一个FMDatabase对象就代表一个单独的SQLite数据库 用来执行SQL语句
②FMResultSet使用FMDatabase执行查询后的结果集
③FMDatabaseQueue用于在多线程中执行多个查询或更新,它是线程安全的
————————————————————————
具体使用
1、导入头文件
#import ""
2、定义成员变量
FMDatabase* _db;
3、创建数据库.db文件
NSString* path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/"];
4、用path路径初始化FMDatabase
_db = [[FMDatabase alloc] initWithPath:path];
5、打开数据库[_db open]
//打开数据库
BOOL res = [_db open];
if (res == NO) {
NSLog(@"打开失败");
return;
}
6、创建表
res = [_db executeUpdate:@"create table if not exists USER(id integer primary key autoincrement,name,score,image)"];
if (res == NO) {
NSLog(@"创建表失败");
}
7、关闭数据库
[_db close];
8、增加操作
//FMDB支持类型 NSString NSNumber NSData
将数据转化为能够存储进数据库的类型
NSData* imageData = UIImagePNGRepresentation(_imageView.image);
NSString* name = _nameField.text;
NSNumber* score = [NSNumber numberWithInt:[_scoreField.text intValue]];
//打开数据库
BOOL res = [_db open];
if (res == NO) {
NSLog(@"打开失败");
}
//插入数据
res = [_db executeUpdate:@"insert into USER(name,score,image) values(?,?,?)", name, score, imageData];
if (res == NO) {
NSLog(@"插入数据失败");
}
[_db close];
9、删除操作
//删
- (void)del:(id)sender{
BOOL res = [_db open];
if (res == NO) {
NSLog(@"打开失败");
return;
}
res = [_db executeUpdate:@"delete from USER where name=?", _nameField.text];
if (res == NO) {
NSLog(@"删除失败");
}
[_db close];
}
10、查询操作
//查
- (void)fetch:(id)sender{
BOOL res = [_db open];
if (res == NO) {
NSLog(@"打开失败");
return;
}
FMResultSet* set = [_db executeQuery:@"select * from USER"];
while ([set next]) {
//取值
NSString* name = [set stringForColumn:@"name"];
int score = [set intForColumn:@"score"];
NSData* data = [set dataForColumn:@"image"];
NSLog(@"%@ --- %d", name, score);
//[set objectForColumnName:@"score"];
}
[_db close];
}
——————————————————————————————————————
多线程管理FMDB:
FMDatabase这个类是线程不安全的,如果在多个线程中同时使用一个FMDatabase实例,会造成数据混乱等问题
为了保证线程安全,FMDB提供方便快捷的FMDatabaseQueue类
使用FMDatabaseQueue很简单,首先用一个数据库文件地址来初使化FMDatabaseQueue,然后就可以将一个闭包(block)传入inDatabase方法中。在闭包中操作数据库,而不直接参与FMDatabase的管理。
FMDatabaseQueue的创建
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];
简单使用 [queue inDatabase:^(FMDatabase *db) {
[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"];
[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Rose"];
[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jim"];
FMResultSet *rs = [db executeQuery:@"select * from t_student"];
while ([rs next]) {
// …
}
}];