iOS之FMDB
1.什么是FMDB
1>FMDB是iOS平台的SQLite数据库框架
2>FMDB以OC的方式封装了SQLite的C语言API
2.FMDB的优点
1>使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码
2>对比苹果自带的Core Data框架,更加轻量级和灵活
3>提供了多线程安全的数据库操作方法,有效地防止数据混乱
3.FMDB有三个主要的类
FMDatabase :一个FMDatabase对象就代表一个单独的SQLite数据库,用来执行SQL语句
FMResultSet :使用FMDatabase执行查询后的结果集
FMDatabaseQueue:用于在多线程中执行多个查询或更新,它是线程安全的
/********打开数据库************/
通过指定SQLite数据库文件路径来创建FMDatabase对象
FMDatabase *db = [FMDatabase databaseWithPath:path];
if (![db open]) {
NSLog(@"数据库打开失败!");
}
文件路径有三种情况
具体文件路径
如果不存在会自动创建
空字符串@""
会在临时目录创建一个空的数据库
当FMDatabase连接关闭时,数据库文件也被删除
nil
会创建一个内存中临时数据库,当FMDatabase连接关闭时,数据库会被销毁
/**************执行更新********************/
在FMDB中,除查询以外的所有操作,都称为“更新”
create、drop、insert、update、delete等
/************执行查询示例*****************/
示例
// 查询数据
FMResultSet *rs = [db executeQuery:@"SELECT * FROM t_student"];
// 遍历结果集
while ([rs next]) {
NSString *name = [rs stringForColumn:@"name"];
int age = [rs intForColumn:@"age"];
double score = [rs doubleForColumn:@"score"];
/**************FMDatabaseQueue*********************/
FMDatabase这个类是线程不安全的,如果在多个线程中同时使用一个FMDatabase实例,会造成数据混乱等问题
为了保证线程安全,FMDB提供方便快捷的FMDatabaseQueue类
FMDatabaseQueue的创建
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];
/*************************个人简单代码介绍*******************/
#import "ViewController.h" #import "FMDB.h" @interface ViewController () @property (strong, nonatomic) FMDatabase *db; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // 0.获得沙盒中的数据库文件名 NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]stringByAppendingPathComponent:@"people.sqlite"]; // NSLog(@"%@",path); // 1.创建数据库实例对象 self.db = [FMDatabase databaseWithPath:path]; // 2.打开数据库 if ([self.db open]) { NSLog(@"数据库打开成功"); //创表 BOOL result = [self.db executeUpdate:@"create table if not exists people(id integer primary key autoincrement, name text, age integer);"]; if (result) { NSLog(@"创表成功"); }else{ NSLog(@"创表失败"); } }else{ NSLog(@"数据库打开失败"); } } - (IBAction)addData { /*********插入单个数据********/ /* BOOL result = [self.db executeUpdate:@"insert into people (name, age) values('chixuedong',20)"]; if (result) { NSLog(@"插入成功"); }else{ NSLog(@"插入失败"); } */ /**********插入多个数据**********/ for (int i = 0; i < 20; i++) { NSString *names = [NSString stringWithFormat:@"chixuedong--%d",i]; NSNumber *ages = @(i); BOOL result = [self.db executeUpdate:@"insert into people (name, age) values(?, ?);",names,ages]; if (result) { NSLog(@"插入成功--- %d",i); }else{ NSLog(@"插入失败--- %d",i); } } } - (IBAction)deleteData { /*********删除全部数据************/ /* BOOL result = [self.db executeUpdate:@"delete from people"]; if (result) { NSLog(@"删除全部数据成功"); }else{ NSLog(@"删除全部数据失败"); } */ /*********根据条件删除指定数据************/ BOOL result = [self.db executeUpdate:@"delete from people where age >10;"]; if (result) { NSLog(@"删除指定数据成功"); }else{ NSLog(@"删除指定数据失败"); } } - (IBAction)update { BOOL result = [self.db executeUpdate:@"update people set name = ? where name = ?;",@"chixuedong",@"chixuedong--10"]; if (result) { NSLog(@"更新数据成功"); }else{ NSLog(@"更新数据失败"); } } - (IBAction)selectData { // 1.查询数据 FMResultSet *result = [self.db executeQuery:@"select * from people where age > ?;",@10]; // 2.遍历结果集 while ([result next]) { NSInteger ID = [result intForColumn:@"id"]; NSString *Name = [result stringForColumn:@"name"]; NSInteger Age = [result intForColumn:@"age"]; NSLog(@"%ld,%@,%ld",ID,Name,Age); } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } @end