iOS学习之——FMDB
2016-05-25 14:55
567 查看
SQLite一种轻量级关系数据库,在嵌入式系统中使用比较广泛。
在iOS中使用SQLite需要添加库libsqlite3.0.dylib,并引入头文件#import
数据库操作:
查询操作:SELECT,返回FMResultSet,nil表示查询失败;
更新操作:非SELECT操作都是更新操作,返回值类型BOOL,YES:成功,NO:失败
数据库事务:
当需要插入的数据较多时,使用事务操作会比较快。
//需要执行的操作
FMResultSet可以不手动关闭,当数据库关闭时,会跟着关闭。
2.FMDatabaseQueue 线程安全,所有的数据库操作会在队列中顺序执行
FMDB是ios平台的SQLite数据库框架;
FMDB以OC的方式封装了SQLite的C语言API
优点:
使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码
对比苹果自带的Core Data框架,更加轻量级和灵活
核心类:
FMDataBase
一个FMDatabase对象就代表一个单独的SQLite数据库
用来执行SQL语句
FMResultSet
使用FMDatabase执行查询后的结果集
FMDatabaseQueue
用于在多线程中执行多个查询或更新,它是线程安全的
在iOS中使用SQLite需要添加库libsqlite3.0.dylib,并引入头文件#import
//打开数据库,资源不足或权限不够会打开失败 if (![db open]) { NSLog(@"数据库打开失败"); } //用完后需要关闭 [db close];
数据库操作:
查询操作:SELECT,返回FMResultSet,nil表示查询失败;
[db executeQuery:sql]; FMResultSet *rs = [db executeQuery:@"SELECT * FROM TableName"]; { while ([rs next]) { //获取查询结果,即使结果只有一条 } }
更新操作:非SELECT操作都是更新操作,返回值类型BOOL,YES:成功,NO:失败
[db executeUpdate:sql];
数据库事务:
当需要插入的数据较多时,使用事务操作会比较快。
[db beginTransaction];
//需要执行的操作
[db commit];
FMResultSet *rs;
FMResultSet可以不手动关闭,当数据库关闭时,会跟着关闭。
2.FMDatabaseQueue 线程安全,所有的数据库操作会在队列中顺序执行
[FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path]; queue inDatabase:^(FMDatabase *db) { // }]; queue inTransaction:^(FMDatabase *db, BOOL *rollback) { // }
FMDB是ios平台的SQLite数据库框架;
FMDB以OC的方式封装了SQLite的C语言API
优点:
使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码
对比苹果自带的Core Data框架,更加轻量级和灵活
核心类:
FMDataBase
一个FMDatabase对象就代表一个单独的SQLite数据库
用来执行SQL语句
FMResultSet
使用FMDatabase执行查询后的结果集
FMDatabaseQueue
用于在多线程中执行多个查询或更新,它是线程安全的
import "FMDB.h" @property(nonatomic,strong)FMDatabase *db; -(void)viewDidLoad{ [super viewDidLoad]; //获取cache文件夹路径 NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES)[0]; //拼接文件名 NSString *filePath = [cachePath stringByAppendingPathComponent:@"student.sqlite"]; //创建一个数据库的实例 FMDatabase *db = [FMDatabase databaseWithPath:filePath]; _db = db; //打开数据库 BOOL flag = [db open]; if(flag){ NSLog(@"打开成功"); }else{ NSLog(@"打开失败"); } //创建数据库表 //数据库操作:插入、更新、删除都属于update //查询Query //参数:sqlite语句 BOOL flag1 = [db executeUpdate:@"create table if not exists t_contact(id integer primary key autoincrement,name text,phone text);"]; if(flag1){ NSLog(@"创建成功"); }else{ NSLog(@"创建失败"); } } //?:表示数据库里面的占位符;且不用打单引号;ps:只能代表对象,不能是基本数据类型,如果是int类型,就包装成NSNumber -(IBAction)insert:(id)sender{ BOOL flag = [_db executeUpdate:@"insert into t_contact(name,phone)values (?,?)",@"ooo",@"23232"]; if(flag){ NSLog(@"success"); }else{ NSLog(@"failure"); } } -(IBAction)select:(id)sender{ FMResultSet *result = [_db executeQuery:@"select *fram t_contact"]; //从结果集里面往下找 while ([result next]) { NSString *name = [result stringForColumn:@"name"]; NSString *phone = [result stringForColumn:@"phone"]; NSLog(@"%@--%@",name,phone); } } -(IBAction)update:(id)sender{ BOOL flag = [_db executeUpdate:@"update t_contact set name = ?",@"adc"]; if(flag){ NSLog(@"success"); }else{ NSLog(@"failure"); } } -(IBAction)delete:(id)sender{ BOOL flag = [_db executeUpdate:@"delete from t_contact" ]; if(flag){ NSLog(@"success"); }else{ NSLog(@"failure"); } } FMDatabase这个类是线程不安全的,如果在多线程中同时使用一个FMDatabase实例,会造成数据混乱等问题 为了包装线程安全FMDB提供方便快捷的FMDatabaseQueue类 FMDatabaseQueue创建 FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path]; -(void)viewDidLoad{ [super viewDidLoad]; //获取cache文件夹路径 NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES)[0]; //拼接文件名 NSString *filePath = [cachePath stringByAppendingPathComponent:@"user.sqlite"]; //创建一个数据库的实例 FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:filePath]; _queue = queue; //创建数据库表 //提供一个多线程安全的数据库实例 queue inDatabase:^(FMDatabase *db){ BOOL flag =[db executeUpdate:@"create table if not exists t_user (id integer primary key autoincrement,name text,money integer)"]; if(flag){ NSLog(@"success"); }else{ NSLog(@"failure"); } } } -(IBAction)insert:(id)sender{ [_queue inDatabase:^(FMDatabase *db){ BOOL flag = [_db executeUpdate:@"insert into t_user(name,money)values (?,?)",@"a",@1000]; if(flag){ NSLog(@"success"); }else{ NSLog(@"failure"); } [_db executeUpdate:@"insert into t_user(name,money)values (?,?)",@"b",@500]; }]; } -(IBAction)select:(id)sender{ [_queue inDatabase:^(FMDatabase *db){ FMResultSet *result = [_db executeQuery:@"select *fram t_user"]; //从结果集里面往下找 while ([result next]) { NSString *name = [result stringForColumn:@"name"]; int money = [result intForColumn:@"money"]; NSLog(@"%@--%@",name,money); } }]; } -(IBAction)update:(id)sender{ // update t_user set money = 500 where name = 'a'; // update t_user set money = 1000 where name = 'b'; // a ->b 500 a 500 // b + 500 = b 1000 [_queue inDatabase:^(FMDatabase *db){ //开启事务 [db beginTransaction]; BOOL flag = [_db executeUpdate:@"update t_user set money = ? where name = ?;",@500 , @"a"]; if(flag){ NSLog(@"success"); } else{ NSLog(@"failure"); //回滚 [db rollback]; } BOOL flag1 = [_db executeUpdate:@"update t_user set money = ? where name = ?;",@1000 , @"b"]; if(flag1){ NSLog(@"success"); } else { NSLog(@"failure"); [db rollbacl]; } //全部操作完成时候再去 [db commit]; }]; } -(IBAction)delete:(id)sender{ [_queue inDatabase:^(FMDatabase *db){ BOOL flag = [_db executeUpdate:@"delete from t_us er "]; if(flag){ NSLog(@"success"); }else{ NSLog(@"failure"); } }]; }
相关文章推荐
- iOS学习之——简单的Git使用
- iOS-支持ipv6-only后,开发者应该做些什么??
- iOS应用内支付(IAP)的那些坑
- iOS 宏HUGE_VALL,HUGE_VAL,HUGE_VALF的含义
- iOS 应用支持 IPv6,就那点事儿
- iOS开发----懒加载
- iOS学习之——开发中常见的英文词汇(持续更新,英文不好的同学可以参考下)
- iOS方法警告
- 博客资源
- iOS 应用支持 IPv6,就那点事儿
- iOS学习之——地图、定位
- iOS学习之——SDWebImage
- iOS学习之——常用三方库(持续更新)
- iOS之文本处理框架TextKit介绍/NSMutableString
- iOS学习之——常用的枚举类型以及名词的含义(持续更新)
- iOS开发进阶 - 用AVFoundation自定义视频录制功能
- iOS开发进阶 - 用AVFoundation自定义视频录制功能
- iOS页面跳转
- IOS 第三方支付的使用:支付宝
- IOS AutoLayout详解(三)用代码实现(附Demo下载)