FMDB
FMDB是iOS平台的SQLite数据库框架,FMDB以OC的方式封装了SQLite的C语言API
FMDB的优点
使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码提供了多线程安全的数据库操作方法,有效地防止数据混乱
FMDB中3个主要的类:FMDB 更多的详细信息,看github
FMDatabase - 代表一个SQLite 数据库,用于执行SQL语句.executeStatements:执行多条sql。executeQuery:执行查询语句。executeUpdate:执行除查询以外的语句,create, drop, insert, delete, update
FMResultSet -代表在FMDatabase中执行查寻的结果数据,通过字段名称获取字段值
FMDatabaseQueue - 如果想在多线程执行查寻和更新,我们将使用该类,处理线程安全。
数据库的创建(Database Creation)
创建一个FMDatabase对象需要一个SQLite数据库文件路径,可以使用的方式之一:
1: 一个系统文件路径,该文件并不一定是存在磁盘上,如果文件不存在,自己手动创建。
2:一个空的字符串,一个空的数据库将被创建在一个零时的位置,当FMDatabase链接被关闭,数据库被删除。
1: 一个系统文件路径,该文件并不一定是存在磁盘上,如果文件不存在,自己手动创建。
2:一个空的字符串,一个空的数据库将被创建在一个零时的位置,当FMDatabase链接被关闭,数据库被删除。
3:NULL,一个内存的数据库被创建,当FMDatabase连接被关闭,数据库将被摧毁。
NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent:@"tmp.db"];
FMDatabase *db = [FMDatabase databaseWithPath:path];
打开数据库(Opening)
在你能够跟数据库交互之前,数据库必须被打开,如果有无效的资源中,数据库打开失败
执行更新操作( Executing Updates)
任何类型的SQL语句,它不是一个SELECT语句都可以用于执行更新(update)。包括CREATE, UPDATE, INSERT, ALTER, COMMIT, BEGIN, DETACH, DELETE, DROP, END, EXPLAIN, VACUUM, REPLACE 等语句。基本上,如果你的SQL语句不是以SELECT开始,它就是一个更新(update)语句。
在你能够跟数据库交互之前,数据库必须被打开,如果有无效的资源中,数据库打开失败
if (![db open]) {
// [db release]; // uncomment this line in manual referencing code; in ARC, this is not necessary/permitted
db = nil;
return;
}
任何类型的SQL语句,它不是一个SELECT语句都可以用于执行更新(update)。包括CREATE, UPDATE, INSERT, ALTER, COMMIT, BEGIN, DETACH, DELETE, DROP, END, EXPLAIN, VACUUM, REPLACE 等语句。基本上,如果你的SQL语句不是以SELECT开始,它就是一个更新(update)语句。
执行更新将返回一个布尔值,如果是YES表示执行update成功,如果返回NO意味着update遇到了错误。可以在代码中使用lastErrorMessage和lastErrorCode方法获取失败的信息。
执行查寻(Executing Queries )
一个SELECT声明是一个查寻语句,可以使用-executeQuery方法进行查寻操作。执行查寻之后,如果查寻成功将返回FMResultSet对象,如果失败为nil。可以在代码中使用lastErrorMessage和lastErrorCode方法获取失败的信息。
为了循环遍历查寻的结果,可以使用while()循环,对于FMDB,最容易的方式如下:
FMResultSet *s = [db executeQuery:@"SELECT * FROM myTable"];
while ([s next]) {
//retrieve values for each record
}
必须值访问查寻结果之前执行 -[FMResultSet next],及时只使用一个:
FMResultSet *s = [db executeQuery:@"SELECT COUNT(*) FROM myTable"];
if ([s next]) {
int totalCount = [s intForColumnIndex:0];
}