实用知识:FMDB使用示例(常用)
2016-05-25 11:14
288 查看
#import "ViewController.h" #import <FMDB/FMDB.h> @interface ViewController () @property (nonatomic,strong) FMDatabase *db; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //获取沙盒Document的路径 NSString *doc =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) lastObject]; //在路径末端加上数据库名字,后缀.db 结尾,如果无此数据库,会自动创建 NSString *filename = [doc stringByAppendingPathComponent:@"T_SQLTest.db"]; //创建数据库,传一个路径即可 self.db = [FMDatabase databaseWithPath:filename]; //判断数据库是否打开 if ([self.db open]) { NSLog(@"数据库打开成功"); //打开成功就可以创建表T_Student,id 是主键,name 与 age 是字段,NOT NULL表示不能为空, BOOL result = [self.db executeUpdate:@"CREATE TABLE IF NOT EXISTS T_Student (id INTEGER PRIMARY KEY AUTOINCREMENT,name text NOT NULL , age INTEGER NOT NULL )"]; if (result) { NSLog(@"创建表成功"); } /*================ 插入命令 ================*/ NSString *name = @"WW"; int age = 123; //executeUpdate:不确定的参数用?来占位(后面参数必须是oc对象,;代表语句结束) [self.db executeUpdate:@"INSERT INTO T_Student (name,age) VALUES(?,?);",name,@(age)]; //executeUpdateWithForamat:不确定的参数用%@,%d等来占位 (参数为原始数据类型,执行语句不区分大小写) [self.db executeUpdateWithFormat:@"INSERT INTO T_Student (name,age) VALUES(%@,%i);",name,age]; //参数是数组的使用方式 [self.db executeUpdate:@"INSERT INTO t_student(name,age) VALUES (?,?);"withArgumentsInArray:@[name,@(age)]]; /*================ 删除命令 ================*/ int idNum = 2; //不确定的参数用?来占位 (后面参数必须是oc对象,需要将int包装成OC对象) [self.db executeUpdate:@"DELETE FROM T_Student WHERE id = ?;",@(idNum)]; //不确定的参数用%@,%d等来占位 [self.db executeUpdateWithFormat:@"DELETE FROM T_Student WHERE name = %@;",name]; /*================ 修改命令 ================*/ [self.db executeUpdate:@"UPDATE T_Student SET name = 'BB' WHERE name = '123';"]; /*================ 查询命令 ================*/ //根据条件查询 FMResultSet *resultSet = [self.db executeQuery:@"SELECT * FROM T_Student WHERE age>14;"]; //查询这个表用*号 resultSet = [self.db executeQuery:@"SELECT * FROM T_Student"]; NSString *RSName; int RSAge; int RSid; //遍历resultSet对象,输出查询结果 while ([resultSet next]) { //用resultSet对象来调用方法,方法返回值为查询结果 RSid = [resultSet intForColumn:@"id"]; RSName = [resultSet stringForColumn:@"name"]; RSAge = [resultSet intForColumn:@"age"]; NSLog(@"id:%d,name:%@,age:%d",RSid,RSName,RSAge); } /*================ 销毁命令 ================*/ [self.db executeUpdate:@"DROP TABLE IF EXISTS T_Student;"]; /*================ FMDB 多线程使用 ================*/ /** * FMDatabase这个类是线程不安全的,如果在多个线程中同时使用一个FMDatabase实例,会造成数据混乱等问题,为了保证线程安全,FMDB提供方便快捷的FMDatabaseQueue类 */ //1.创建队列,路径传要操作的数据库的文件路径 FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:filename]; //定义一个 bool 值对象,每次执行操作都会返回,通过返回值判断是否操作成功,不成功就return __block BOOL whoopsSomethingWrongHappened = true; //2.把任务包装到事务里 [queue inTransaction:^(FMDatabase *db, BOOL *rollback) { whoopsSomethingWrongHappened &= [db executeUpdate:@"INSERT INTO T_Student (name,age) VALUES('cc',33);"]; whoopsSomethingWrongHappened &= [db executeUpdate:@"INSERT INTO T_Student (name,age) VALUES('dd',44);"]; whoopsSomethingWrongHappened &= [db executeUpdate:@"INSERT INTO T_Student (name,age) VALUES('gg',55);"]; //如果有错误 返回 if (!whoopsSomethingWrongHappened) { *rollback = YES; return; } }]; } } @end
相关文章推荐
- memcached分布式实现原理
- JavaScript概述
- 从用户浏览器输入url到用户看到页面结果的过程,发生了什么事情?
- IOS(CGGeometry)几何类方法总结
- 判断网络是否连接
- jar
- 喜马拉雅案列
- go并发
- springMVC上传
- scp 是我小看了你-基于密钥传输! 推荐
- 前端程序员必知的30个Chrome扩展
- Cause: java.sql.SQLException: Connection is read-only. Queries leading to data modification are not
- Postgresql判断表是否存在
- iOS 用CornerStone配置SVN,HTTP及svn简单使用说明
- VIM
- 我关注的开源项目
- 移动端Push推送
- Windows下查看系统服务
- Android app 多开-学习记录
- 教你如何实现华为,小米,魅族等定制等系统应用间的跳转,权限管理,自启动管理等与定制rom交互(也是基于反编译研究成果有感怕忘记下来)