FMDB是对sqlite的封装,把面向过程,c接口封装成了大家熟悉的oc接口,并且对sqlite中令人头疼的线程安全做了处理,当然不变的是还是跟sqlite一样,需要我们写NSString类型的sql语句,一不小心拼错了,检查各大半天,小吐槽一下。
言归正传,FMDB是没有图片类型的字段的,但是提供了更灵活地方法:blob类型,也就是二进制,所以我们只要把图片转化为NSData就可以存放了。
下面是存放学生信息的例子(名字,年龄,性别,头像), 分别为字符串(text),整形(integer),字符串(text),二进制(blob),关键就是blob这个类型
//创建数据库
- (void) createDB {
NSString *docmentDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *fileName = [docmentDir stringByAppendingPathComponent:@"wqm.db"];
_db = [FMDatabase databaseWithPath:fileName];
}
//创建表
- (void) createTable {
if ([_db open]) {
NSString *sql = @"CREATE TABLE IF NOT EXISTS student(name text, age integer, sex text, avtar blob);"; //头像是blob类型
BOOL bResult = [_db executeUpdate:sql];
if(bResult) {
NSLog(@"表创建成功!");
}
else {
NSLog(@"表创建失败!");
}
[_db close];
}
}
//插入数据
- (void) addData:(NSString *)name age:(NSInteger) age sex:(NSString *)sex avtar:(NSData*)data{
if ([_db open]) {
NSString *sql =@"INSERT INTO student(name, age, sex, avtar) VALUES (?, ?, ?, ?)";
BOOL bResult = [_db executeUpdate:sql, name, @(age), sex, data];
//*
//注意:
//1、使用executeUpdate:sql的参数必须是NSObject类型(见上面的age),否者会报EXC_BAD_ACCESS
//2、上面的语句不要这么写,这么写是无法保存二进制的(没二进制数据的时候是可以)
// NSString *sql = [NSString stringWithFormat:@"INSERT INTO student(name, age, sex, avtar) VALUES ('%@', '%ld', '%@', '%@')", name, (long)age, //sex, data];
// BOOL bResult = [_db executeUpdate:sql];
*/
if(bResult) {
NSLog(@"数据插入成功!");
}
else {
NSLog(@"数据插入失败!");
}
}
[_db close];
}
//获取数据
- (void) getData {
if ([_db open]) {
NSString *sql = [NSString stringWithFormat:@"SELECT * FROM student"];
FMResultSet *resultSet = [_db executeQuery:sql];
while ([resultSet next]) {
NSString *name = [resultSet stringForColumn:@"name"];
NSInteger age = [resultSet intForColumn:@"age"];
NSString *sex = [resultSet stringForColumn:@"sex"];
NSData *data = [resultSet dataForColumn:@"avtar"];
//UIImage *image = [UIImage imageWithData:data];
}
}
[_db close];
}