在网上查过一些资料,感觉都千篇一律,不过也加深了自己对FMDB的认识,同时也能了解到作者对FMDB理解的深浅。当然不可能一篇文章就能完全让人明白理解并熟练的应用一个知识,唯有多看、多听、多学。
本文将不在赘诉关于:FMDB 是什么、优缺点、怎么安装、以及库里都有哪些类等等,如果有不知道的,请任意点开一篇关于FMDB的文章(除了本文😄)
创建一个数据库

创建数据库的路径说明
1、给一个完整确切的路径(数据库命名格式 xxx.db ),这个用上面的
[FMDatabase databaseWithPath:path] 就能在指定位置创建一个自己命名的 xxx.db 数据库;
2、当给一个@“”空字符串作为路径时,FMDatabase创建一个临时的数据库,当FMDatabase关闭数据库时,数据库销毁。同理当路径为NULL时也一样。
有了库,还不能存数据,必须建表.(略过)
数据库的打开与关闭
1、FMDatabase
用FMDatabase创建数据库时,每一次的打开都会伴随着关闭,这是为了数据库不被同时操作所必需的步骤 因为同时操作可能会出现问题,任何增删改查都在 打开后操作,关闭前结束
2、FMDatabaseQueue
FMDatabaseQueue是线程安全的,所以就不会有上面FMDatabase那样的打开就必须关闭的动作。对于FMDatabaseQueue有两种处理数据的方法
[queue inDatabase:^(FMDatabase *db) {
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @1];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @2];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @3];
FMResultSet *rs = [db executeQuery:@"select * from foo"];
while ([rs next]) {
…
}
}];
[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @1];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @2];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @3];
if (whoopsSomethingWrongHappened) {//哎哟 something wrong happened
*rollback = YES;
return;
}
// etc ...
}];
第一种就是普通的操作数据,第二种是所谓的事务(transaction:交易、业务、事务、处理),所谓事务是指由一系列的事(ABC转换成小写
)共同组成的一件事(大写转小写
),如果中途任何一个环节出现问题(abC:C没能变成小写
),整个事件都算失败,如果失败 设置*rollback = YES 那数据库的数据将不变(ABC
)。
FMDB能不能存储对象
FMResultSet has many methods to retrieve data in an appropriate format:
当然可以, fmdb存储的类型
intForColumn:
longForColumn:
longLongIntForColumn:
boolForColumn:
doubleForColumn:
stringForColumn:
dateForColumn:
dataForColumn:
dataNoCopyForColumn:
UTF8StringForColumnName:
objectForColumnName:
但object不能直接存储,来看看FMDB内部是怎么处理的
- (id)objectForColumnName:(NSString*)columnName {
return [self objectForColumnIndex:[self columnIndexForName:columnName]];
}
- (id)objectForColumnIndex:(int)columnIdx {
int columnType = sqlite3_column_type([_statement statement], columnIdx);
id returnValue = nil;
if (columnType == SQLITE_INTEGER) {
returnValue = [NSNumber numberWithLongLong:[self longLongIntForColumnIndex:columnIdx]];
}
else if (columnType == SQLITE_FLOAT) {
returnValue = [NSNumber numberWithDouble:[self doubleForColumnIndex:columnIdx]];
}
else if (columnType == SQLITE_BLOB) {
returnValue = [self dataForColumnIndex:columnIdx];
}
else {
//default to a string for everything else
returnValue = [self stringForColumnIndex:columnIdx];
}
if (returnValue == nil) {
returnValue = [NSNull null];
}
return returnValue;
}
显而易见 object 的类型会是SQLITE_INTEGER、SQLITE_FLOAT、SQLITE_BLOB、SQLITE_TEXT中的一种,所以存储对象的方法之一是,把对象 归档 成NSData来进行存储
为了在程序中随处可用,最好建一个DBManager来管理 创建 以及增删改查,对于FMDB的封装已经很多了,可以选择一个舒服来用。
网友评论