disk i/o error

问题原因:在操作数据库时,发生此错误。

斗争历程:

1.因某种原因,需要本地删除数据库。

具体操作:找到数据库路径dbpath,执行删除操作。

    NSError *err;
    BOOL suc = [[NSFileManager defaultManager] removeItemAtPath:dbPath error:&err];
    DLog(@"删除数据库%d",suc);
2.删除数据库之后,再次操作数据库,发生disk i/o error。

数据库模型:DataBaseModel(单例模式),写法如下,其中在init方法中实现数据库路径及其创建工作。

单例方式一:

static DataBaseModel *s_instance;
+(instancetype)sharedinstance{
    @synchronized (self) {
        if (!s_instance) {
            s_instance = [[DataBaseModel alloc]init];
        }
    }
    return s_instance;
}

单例方式二:

static DataBaseModel *dbm;
static dispatch_once_t   onceToken;

@implementation DataBaseModel

+ (instancetype)sharedInstance {
    dispatch_once(&onceToken, ^{
        dbm = [[self alloc] init];
    });
    return dbm;
} 
@end

具体原因:此时数据库已经被删除再次操作导致发生此错误。那么重新创建数据库,再次使 DataBaseModel *dbm=[DataBaseModel sharedinstance]创建数据库对象,但是并不会创建新实例,所以数据库并不能重建;将dnm = nil之后也不可以。

解决办法:

单例一:在删除数据库的同时,调用cleanSharedinstance方法。

- (void)cleanSharedinstance {
    s_instance = nil;
}
单例二:在删除数据库的同时,将onceToken = 0.

解决方法参考 ==>作者: FlyElephant  文章链接:iOS单例清除







你可能感兴趣的:(iOS开发errors)