FMDB是一个基于sqlite_3封装的第三方数据库,相比调用Apple原生的sql语句简单许多。下面简单看下怎么使用。
目录结构
首先是创建数据库存放的路劲,在ios应用程序里面,每个应用对应一个空间,称为沙盒。应用只能访问自己沙盒内部的资源,不能越界访问别的沙盒。通过NSHomeDirectory()可以找到沙盒的路劲,打开finder,选择前往,输入打印的地址例如:
/Users/xxx/Library/Application Support/iPhone Simulator/7.1/Applications/69454C51-6BA5-41DD-AE6B-1BA16D42F9C7
在这个目录下可以看到有四块内容,分别是Document,Library,App包名称,temp。
- Document 一般存放程序中建立的文件,比如数据库文件,itunes备份时候会同步备份该目录下文件。
- Library 主要存放默认设置和状态信息。该目录下分为Cache和Preferences两个目录,Caches存放程序中缓存的文件,保存程序下次启动需要的信息,在应用程序退出时候也不会删除,不会同步备份这部分数据。Preferences主要存放设置信息,比如UserDefault的文件,以plist形式存放在该目录下。
- App包名称 默认生成的文件,包含程序所有的资源文件,比如bundle,图片,音频,视频等资源,不要修改这部分内容,否则运行时候会报错。
- temp 存放临时创建的文件,下次程序启动不需要的信息。
了解了文件存放目录情况,我们首先来创建数据库,FMDB提供三种方式
- 创建一个路劲存放数据库,比如说在Document/xx.DB,数据库就存放在Document下面。如果不指定路劲或者路劲不正确也没关系,会自动创建一个路劲。
- 如果指定@“”路劲,那么会在temp目录下创建一个临时目录,数据库链接关闭时候会自动被删除。
- 如果传递一个NULL,那么会在内存中创建一个数据库,同样的数据库链接关闭时候会被自动删除。
我们指定在Document下面创建数据库,需要判断是否能够成功打开,避免空间不够等原因导致失败。
创建数据库
//创建一个数据库
NSArray *documentArrar = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [documentArrar objectAtIndex:0];
NSString *tempPath = NSTemporaryDirectory();
NSLog(@"documentPath = %@",documentPath);
NSLog(@"tempPath = %@",tempPath);
NSString *path = [documentPath stringByAppendingPathComponent:@"TF.db"];
_dataBase = [FMDatabase databaseWithPath:path];
if (![_dataBase open]) {
NSLog(@"fail to open db");
return;
}
[_dataBase close];
我们创建了一个名称叫TF.db的数据库。
更新操作
除了select操作之外都是更新操作,使用executeUpdate方法执行。
增加:
首先我们创建表,首先是User表,他有name,age,address等属性。
[_dataBase executeUpdate:@"CREATE TABLE User (Name NSString, Age NSInteger,Address NSString,TelePhone NSInteger,ID int)"];
User括号里的分别对应着属性和类型
在Document路径下通过数据库软件打开数据库可以看到
插入:
通过INSERT INTO 表名 (参数名称,...)VAULES (?,...) 来更新表里面对应参数的值,例如
[_dataBase executeUpdate:@"INSERT INTO User (Name,Age,Address,TelePhone,ID) VALUES (?,?,?,?,?)",@"lirihuang",[NSNumber numberWithInt:24],@"chenzhou",[NSNumber numberWithFloat:18612254138],[NSNumber numberWithInteger:46]];
打开数据库软件可以看到
值得注意的是VULES里面需要传入是对象,不能是简单数据类型,比如整形,需要用NSNumber包装成对象。
删除:
[_dataBase executeUpdate:@"DELETE FROM User WHERE Age = 24"];
这句话意思是删除User表中指定列Age=24。
查找
使用executeQuery方法来查找数据库中元素。如果要查找表中全部列,使用*通配符查找。
FMResultSet *rs = [_dataBase executeQuery:@"SELECT * FROM User"];
if ([rs next]) {
NSString *name = [rs stringForColumn:@"Name"];
int age = [rs intForColumn:@"Age"];
NSString *address = [rs stringForColumn:@"Address"];
NSLog(@"name = %@ age = %d,address = %@",name,age,address);
}
[rs close];