ARC 和 MRC
项目中使用 ARC 还是 MRC,对使用 FMDB 都没有任何影响,FMDB 会在编译项目时自动匹配。
使用
在 FMDB 中有三个重要的类:
FMDatabase:是一个提供 SQLite 数据库的类,用于执行 SQL 语句。
FMResultSet:用在 FMDatabase 中执行查询的结果的类。
FMDatabaseQueue:在多线程下查询和更新数据库用到的类。
数据库创建
FMDatabase 是通过一个 SQLite 数据库文件路径创建的,此路径可以是以下三者之一:
一个文件的系统路径。磁盘中可以不存在此文件,因为如果不存在会自动为你创建。
一个空的字符串 @""。会在临时位置创建一个空的数据库,当 FMDatabase 连接关闭时,该数据库会被删除。
NULL。会在内存中创建一个数据库,当 FMDatabase 连接关闭时,该数据库会被销毁。
// 创建数据库示例
FMDatabase *db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
打开数据库
数据库必须是打开状态,才能与之交互。如果没有足够的资源和权限来打开\创建数据库,数据库会打开失败。
数据库更新
SQL 语句中除过 SELECT 语句都可以称之为更新操作。包括 CREATE,UPDATE,INSERT,ALTER,COMMIT,BEGIN,DETACH,DROP,END,EXPLAIN,VACUUM,REPLACE 等。一般只要不是以 SELECT 开头的 SQL 语句,都是更新语句。
执行更新语句后会返回一个 BOOL 值,返回 YES 表示执行更新语句成功,返回 NO 表示出现错误,可以通过调用 -lastErrorMessage 和 -lastErrorCode 方法获取更多错误信息。
数据库查询
通过调用 -executeQuery... 方法之一执行 SELECT 语句进行数据库查询操作。
执行查询操作后,如果成功会返回一个 FMResultSet 对象,反之会返回 nil。通过 -lastErrorMessage 和 -lastErrorCode 方法可以确定为什么会查询失败。
为了遍历查询结果,需要 while() 循环,然后逐条记录查看。在 FMDB 中,可以通过下面的简单方式实现:
FMResultSet *s = [db executeQuery:@"SELECT * FROM myTable"];
while ([s next]) {
// 每条记录的检索值
}
即使只需要获取一个数据,也还是必须在访问查询结果前调用 -[FMResultSet next]。
// 示例
FMResultSet *s = [db executeQuery:@"SELECT COUNT(*) FROM myTable"];
if ([s next]) {
int totalCount = [s intForColumnIndex:0];
}
FMResultSet 提供了很多方便的方法来查询数据:
intForColumn:
longForColumn:
longLongIntForColumn:
boolForColumn:
doubleForColumn:
stringForColumn:
dateForColumn:
dataForColumn:
dataNoCopyForColumn:
UTF8StringForColumn:
objectForColumn:
这些方法都有一个 {type}ForColumnIndex: 变体,是基于列的位置来查询数据。
通常情况下,一个 FMResultSet 没有必要手动 -close,因为结果集合 (result set) 被释放或者源数据库关闭会自动关闭。
关闭数据库
当对数据库进行查询和更新操作完成后,需要调用 -close 关闭数据库 FMDatabase 的连接。
// 示例
[db close];
实例如下
-(void)initDB
{
NSString * theDomentpath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString * path = [theDomentpath stringByAppendingPathComponent:@"PPP.sqlite"];
fmdb = [[FMDatabase alloc]initWithPath:path];
if ([fmdb open]) {
[fmdb executeUpdate:@"create table class (theID integer primary key ,name text , age text)"];
[fmdb close];
NSLog(@"数据库开辟成功");
}
else
{
NSLog(@"数据库开启失败");
}
}
-(NSMutableArray *)Marr
{
NSMutableArray * Marr = [NSMutableArray new];
[fmdb open];
FMResultSet * set = [[FMResultSet alloc]init];
set = [fmdb executeQuery:@"select * from class"];
while ([set next]) {
Model * mm = [[Model alloc]init];
mm.theID = [set intForColumn:@"theID"];
mm.name = [set stringForColumn:@"name"];
mm.age = [set stringForColumn:@"age"];
[Marr addObject:mm];
}
[fmdb close];
return Marr;
}
-(void)insertData:(Model *)theData
{
[fmdb open];
NSString * str = [[NSString alloc]initWithFormat:@"insert into class values (null,'%@','%@')",theData.name,theData.age];
BOOL isq = [fmdb executeUpdate:str];
if (isq) {
NSLog(@"添加成功");
}
else
{
NSLog(@"添加失败");
}
[fmdb close];
}
-(void)UpData:(Model *)theData
{
[fmdb open];
NSString * str = [NSString stringWithFormat:@"update class set name = '%@' , age = '%@' where theID = '%ld'",theData.name,theData.age,theData.theID];
BOOL isq = [fmdb executeUpdate:str];
if (isq) {
NSLog(@"修改成功");
}
else
{
NSLog(@"修改失败");
}
[fmdb close];
}
-(void)deleteData:(Model *)theData
{
[fmdb open];
NSString * str = [NSString stringWithFormat:@"delete from class where theID = '%ld'",theData.theID];
BOOL isq = [fmdb executeUpdate:str];
if (isq) {
NSLog(@"删除成功");
}
else
{
NSLog(@"删除失败");
}
[fmdb close];
}