iOS个人整理42-FMDB
来源:互联网 发布:剑三淘宝 编辑:程序博客网 时间:2024/05/27 14:14
创建FMDatabas对象时参数为SQLite数据库文件路径,该路径可以是一下三种方法之一
1.文件路径。该文件路径无需真实存在,如果不存在会自动创建
2.空字符串@”“,表示会在临时目录创建一个空的数据库,当FMDatabase连接关闭时,文件也会被删除。
3.NULL。将创建一个内在数据库,同样,当FMDatabase连接关闭时,数据将被销毁
FMDB的使用
//得到沙盒地址方法-(NSString*)sandBox{ NSArray *docArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *path = docArray[0]; NSString *filePath = [path stringByAppendingPathComponent:@"fmdb.sqlite"]; return filePath;}//fmdb打开数据库和建表-(void)openAndCreat{ //得到数据库对象 FMDatabase *db = [FMDatabase databaseWithPath:[self sandBox]]; BOOL isOpen = [db open]; if (isOpen) { NSLog(@"db ok"); //建表,所有无返回集的操作都可以用update来执行sql语句,返回值为bool,判断操作成功 BOOL isCreat = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS myFMDB (id integer PRIMARY KEY AUTOINCREMENT,name text NOT NULL,age integer NOT NULL DEFAULT 0)"]; if (isCreat) { NSLog(@"table ok"); } else {//建表失败 [db lastError]; NSLog(@"table fs"); } } else { NSLog(@"db fs"); }}//增加数据-(void)insertData{ //得到实例对象 FMDatabase *db = [FMDatabase databaseWithPath:[self sandBox]]; //先关闭 [db close]; if ([db open]) { //打开成功,插入数据 NSInteger age = [_ageTextField.text integerValue]; //两种方式 //使用update传参,占位符为?,参数值必须为对象 BOOL isExe = [db executeUpdate:@"INSERT INTO myFMDB (name,age)values(?,?)",_nameTextField.text,@(age)]; //使用updateWithFormat,占位符%@等 BOOL isExe2 = [db executeUpdateWithFormat:@"INSERT INTO myFMDB (name,age)values(%@,%d)",@"王",11]; if (isExe && isExe2) { NSLog(@"insert ok"); } }}//搜索方法-(void)queryData{ FMDatabase *db = [FMDatabase databaseWithPath:[self sandBox]]; [db open]; //执行查询 FMResultSet *result = [db executeQuery:@"SELECT * FROM myFMDB"]; //存储查询结果 _resultMArray = [[NSMutableArray alloc]init]; //循环获得结果集 //next 为ture时继续取下一条 while ([result next]) { NSString *name = [result stringForColumn:@"name"]; NSInteger age = [result intForColumn:@"age"]; NSInteger id = [result intForColumn:@"id"]; NSLog(@"id = %ld,name = %@,age = %ld",id,name,age); NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:name,@"name",@(age),@"age",@(id),@"id",nil]; [_resultMArray addObject:dic]; } //释放结果集 [result close]; //搜索表里的记录数 [db executeQuery:@"select count(*) from myFMDB"]; //关数据库 [db close];}//单个字段值的查询-(void)querySumRow{ FMDatabase *db = [FMDatabase databaseWithPath:[self sandBox]]; if ([db open]) { int sumRow = [db intForQuery:@"select age from myFMDB where id = 5"]; int sumRow2 = [db intForQuery:@"select count(*) from myFMDB"]; NSLog(@"%d,%d",sumRow,sumRow2); } }
FMDB多线程方法
//调用多线程方法-(void)beginThread{ NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; [formatter setDateFormat:@"yy-MM-dd,hh:mm:ss.SSS"]; //开始时间 NSLog(@"%@",[formatter stringFromDate:[NSDate date]]); //建表 [self createSecondTable]; //两种方法 [self threads]; // [self threadsSecond];不使用事务 //插入操作 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [self threadsSecond]; NSLog(@"%@",[NSThread currentThread]); dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"这里是主线程--%@",[NSThread currentThread]); }); }); //结束时间 NSLog(@"%@",[formatter stringFromDate:[NSDate date]]);}#pragma mark -- 多线程-(void)threads{ //创建队列 FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:[self sandBox]]; __block BOOL isError = NO; //使用事务的方式处理多个操作,不需要手动打开或关闭数据库 [queue inTransaction:^(FMDatabase *db, BOOL *rollback) { //回滚,从错误操作开始回滚到正确的操作 for (int i = 0 ; i < 100000; i++) { NSString *sql = @"insert into stu (name,age,gender)values(?,?,?);"; //插入操作 isError = [db executeUpdate:sql,@"飞燕",@(i),@"女"]; } if (!isError) { NSLog(@"insert fs"); *rollback = YES;//插入出错,回滚到上次正确的地方; } }];}//不使用事物处理多线程-(void)threadsSecond{ //得到队列 FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:[self sandBox]]; __block BOOL isError = NO; //不使用事务的多线程操作 [queue inDatabase:^(FMDatabase *db) {// [db beginTransaction];//开始事务 for (int i = 0 ; i < 1000; i++) { NSString *sql = @"insert into stu (name,age,gender)values(?,?,?);"; //插入操作 isError = [db executeUpdate:sql,@"飞燕",@(i),@"女"]; } if (!isError) { NSLog(@"insert fs"); }// [db commit];//事务提交 NSLog(@"%@",[NSThread currentThread]); }]; //上面是gcd同步队列 //关闭动画 dispatch_async(dispatch_get_main_queue(), ^{ //刷新UI要写在主线程 [self.loadV stopAnimation]; });}
0 0
- iOS个人整理42-FMDB
- iOS FMDB
- iOS FMDB
- iOS-FMDB
- iOS FMDB
- iOS FMDB
- iOS-FMDB
- FMDB - - 归纳整理- Vic_Li
- FMDB 常用操作整理
- ios 调用webservice整理 + 个人针对补充
- iOS第一个项目错误个人整理
- iOS个人整理02-UILabel/UIIamgeView
- iOS个人整理03-UIButton按钮
- iOS个人整理13-导航控制器-UINavigationController
- iOS个人整理17-警示框--UIAlertController
- iOS个人整理15-UIImagePickerController,照片选择器
- iOS个人整理18-UITableView表视图
- iOS个人整理22-可视化编辑-XIB
- STL学习笔记——序列式容器
- EM算法-数学原理及其证明
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 《Deep Learning》中文翻译总结
- iOS个人整理42-FMDB
- UTF-8编码格式导致编码GBK的不可映射字符问题
- codevs 1098 均分纸牌【贪心】
- BNUOJ-49098-神奇的身高
- 2020
- hihoCoder 1051 补提交卡(贪心枚举)
- 《引爆点》学习笔记一
- 【POJ 3440】 Coin Toss(概率公式)
- 计算String公式网站参考