问题原因:在操作数据库时,发生此错误。
斗争历程:
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单例清除