美文网首页
使用 FMDB 框架时候,error opening!: 14错

使用 FMDB 框架时候,error opening!: 14错

作者: l蓝色梦幻 | 来源:发表于2018-06-01 14:47 被阅读43次

    环境

    测试环境:Xcode6.2 (6C131e) iPhone 4S模拟器

    系统版本: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 文件夹都已经删除了。而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在做缓存的时候,如果文件夹不存在就会立即创建一个。

    相关文章

      网友评论

          本文标题:使用 FMDB 框架时候,error opening!: 14错

          本文链接:https://www.haomeiwen.com/subject/jvqksftx.html