使用 FMDB 框架时候,error opening!: 14错误的修改问题
2015-05-01 15:14
363 查看
测试环境:Xcode6.2 (6C131e) iPhone 4S模拟器
系统版本:IOS 7.1
第三方框架:FMDB、SDWebImage。
今天测试代码的时候,发现程序在运行的时候,只要清空缓存,立即去数据库查找数据的时候,FMDB 就会报出错误:
error opening!: 14
Could not create database queue for path XXX
出现错误的代码:
数据库访问的代码
这里可以看到,在清理缓存,其实是整个 cache 文件夹都已经删除了。这个时候如果再去读取数据库数据的时候会发现直接报错,无法创建数据库。原因就是cache 这个文件夹其实已经不存在了(被删除了),FMDB 创建SQLite数据库文件的时候,不能够递归创建不存在的文件夹,因此这个时候出现了错误。
解决方案:
1、清理缓存的时候,再自己建一次 cache 文件夹。
2、自己在创建SQLite 数据库文件的时候判断一下目标文件夹是否存在,不存在就创建一个。
针对以上的代码做出的修改:
在测试过程中,发现 SDWebImage 不会出现这个问题。SDWebImage在做缓存的时候,如果文件夹不存在就会立即创建一个。
系统版本:IOS 7.1
第三方框架:FMDB、SDWebImage。
今天测试代码的时候,发现程序在运行的时候,只要清空缓存,立即去数据库查找数据的时候,FMDB 就会报出错误:
error opening!: 14
Could not create database queue for path XXX
出现错误的代码:
数据库访问的代码
(void)setup { // 1、获取沙盒中数据库的路径 NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"test.sqlite"]; // 2、创建队列 _queue = [FMDatabaseQueue databaseQueueWithPath:fullPath]; // 3、创建表 [_queue inDatabase:^(FMDatabase *db) { [db executeUpdate:@"create table if not exists ...);"]; }]; } // ... + (NSArray *)statusWithParam:(MLHomeStatusesParam *)param { [self setup]; // 这里出错 NSLog(@"statusWithParam----%@",_queue); __block NSMutableArray *statusArray = nil; // _queue使用的时dispatch_sync方法。因此就是在主线程中查询数据库的 [_queue inDatabase:^(FMDatabase *db) { //.... }]; [_queue close]; return statusArray; }清空缓存的代码:
clearCache.operation =^{ NSFileManager *manager = [NSFileManager defaultManager]; NSString *catchPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; [MBProgressHUD showMessage:@"正在帮您拼命情理中...."]; // 清除缓存 NSError *error; [manager removeItemAtPath:catchPath error:&error]; [MBProgressHUD hideHUD]; };
这里可以看到,在清理缓存,其实是整个 cache 文件夹都已经删除了。这个时候如果再去读取数据库数据的时候会发现直接报错,无法创建数据库。原因就是cache 这个文件夹其实已经不存在了(被删除了),FMDB 创建SQLite数据库文件的时候,不能够递归创建不存在的文件夹,因此这个时候出现了错误。
解决方案:
1、清理缓存的时候,再自己建一次 cache 文件夹。
2、自己在创建SQLite 数据库文件的时候判断一下目标文件夹是否存在,不存在就创建一个。
针对以上的代码做出的修改:
clearCache.operation =^{ NSFileManager *manager = [NSFileManager defaultManager]; NSString *catchPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; [MBProgressHUD showMessage:@"正在帮您拼命情理中...."]; // 清除缓存 NSError *error; [manager removeItemAtPath:catchPath error:&error]; [manager createDirectoryAtPath:catchPath withIntermediateDirectories:YES attributes:nil error:NULL]; [MBProgressHUD hideHUD]; };
+(void)setup { // 1、获取沙盒中数据库的路径 NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; NSString *fullPath = [path stringByAppendingPathComponent:@"test.sqlite"]; // 2、判断 caches 文件夹是否存在.不存在则创建 NSFileManager *manager = [NSFileManager defaultManager]; BOOL tag = [manager fileExistsAtPath:path isDirectory:NULL]; if (!tag) { [manager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:NULL]; } // 2、创建队列 _queue = [FMDatabaseQueue databaseQueueWithPath:fullPath]; // 3、创建表 [_queue inDatabase:^(FMDatabase *db) { [db executeUpdate:@"create table if not exists ....);"]; }]; } // .... + (NSArray *)statusWithParam:(MLHomeStatusesParam *)param { [self setup]; // 这里已经不再报错了 __block NSMutableArray *statusArray = nil; // _queue使用的时dispatch_sync方法。因此就是在主线程中查询数据库的 [_queue inDatabase:^(FMDatabase *db) { // ... }]; [_queue close]; return statusArray; }
在测试过程中,发现 SDWebImage 不会出现这个问题。SDWebImage在做缓存的时候,如果文件夹不存在就会立即创建一个。
相关文章推荐
- 集合已修改;枚举操作可能无法执行。使用foreach 循环删除DataRow的时候的问题! 该死的AcceptChanges() Row.elete() Remove(Row)使用不同。
- Struts2.1.8 验证框架(validation)的使用中遇到的一些问题(直接访问jsp遇到的错误)
- Struts2.1.8 验证框架(validation)的使用中遇到的一些问题(直接访问jsp遇到的错误)--Allen
- mysql 删除和修改的时候,where 条件中使用原table报错的问题
- 使用IIS Host WCF服务时候出现的地址错误的问题
- 问题: 在eclipse里使用ctr+shift+t打开一个类的时候,出现错误:Class file name must end with .class
- 解决使用Win2003远程桌面连接服务器的时候就报超过最大连接数错误问题
- SWFupload 组件在整合其他框架的时候上传错误问题的原因(filter)
- 解决创建SharePoint网站的时候使用IIS标头错误的问题
- 修改camera录像的时候平台框架设置问题.
- kindEditor 在springMvc+freemarker +hibernate 框架中使用 以及使用的时候产生的问题的解决
- Linux 修改系统变量错误大致基础命令不能使用问题修复!
- 怎么解决windows下使用eclipse和python编译时候 "Non-ASCII character"错误问题
- 使用SetWindowPos API函数移动窗口后,还需修改Delphi的属性值,以备下次使用,否则就会出问题(不是API不起作用,而是使用了错误的坐标值)
- [CAQ5]使用okhttp等三方网络框架的时候出现超时错误
- 使用FMDB时,出现错误:error opening!: 14
- CI框架中登录时候使用 加密 session 以及session注意的问题
- Android 中使用IDE为Android Studio时候,后台类型从double 改成 int,但是客户端还是显示double问题(JAVA修改Model类型,但是无效)
- 【ZYNQ LINUX】使用问题04 ubuntu12 环境变量修改错误,不能进入root 修改的解决办法
- 关于使用SSM整合的时候,使用hibernate校验框架出现500异常问题解决