2015-11-03 115 views
0

最近我为我的不同域模型(代表持久数据的一个子集)添加了一些并发访问。我崩溃报告表明,我现在在上iOS7,iOS8上& iOS9一些错误绊倒,这一切似乎是基于NSPersistentStoreCoordinator在尝试访问sqlite文件时引发错误NSSQLiteErrorDomain = 26

NSSQLiteErrorDomain = 26,NSUnderlyingException =在路径文件不 似乎是一个SQLite数据库 在我的位置标注在源代码

可惜我不能复制它,我真的不能想象,sqlite的文件不会在某些设备上存在,因为我有我的应用程序包出货。

  1. 在我的代码中是否有一个缺陷,阻止我访问sqlite文件?
  2. 除了丢失文件外,是否还有可能发生这种错误?

继承人为我的模型单身的初始化和NSManagedObjectContext

+ (id) sharedModel { 
    static id sharedModel = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken,^{ 
     sharedModel = [[self alloc] initWithStoreURL: kDefaultStoreURL]; 
    }); 
    return sharedModel; 
} 

- (id) initWithStoreURL:(NSURL *)storeURL { 
    self = [super init]; 
    if (self) { 
     // create managed object model 
     NSURL * modelURL = [[NSBundle mainBundle] URLForResource: @"MyApp" withExtension: @"momd"]; 
     NSManagedObjectModel *objectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL: modelURL]; 
     // create persistent store coordinator 
     NSError * error = nil; 
     NSPersistentStoreCoordinator * storeCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:objectModel]; 
     if (![storeCoordinator addPersistentStoreWithType: NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { 
      CLS_LOG(@"Unresolved error %@, %@", error, [error userInfo]); 
      // this is where the error occurs 
      abort(); 
     } 
     // init managedObjectContext 
     context = [[NSManagedObjectContext alloc] initWithConcurrencyType: NSMainQueueConcurrencyType]; 
     [context setPersistentStoreCoordinator:storeCoordinator]; 
     _mainContext = context; 

     _someDomainModel1 = [[SomeDomainModel1 alloc] initWithContext:_mainContext]; 
     _someDomainModel2 = [[SomeDomainModel2 alloc] initWithContext:_mainContext]; 
    } 
    return self; 
} 

回答

1

initWithStoreURL我的源代码可能会出现问题,但如果你已经一直使用相同的代码,也许我做出不正确的假设。

你说你的SQLite存储文件是随软件包一起提供的,如果是这种情况,你需要以只读模式和回滚模式打开它。

NSDictionary *storeOptions = @{ 
    NSReadOnlyPersistentStoreOption:@YES, 
    NSSQLitePragmasOption:@{@"journal_mode":@"DELETE"}}; 

然后,在添加商店时使用这些选项。此外,由于您看到了这一点,因此您应该记录更多信息(如URL和错误对象的详细信息)。

但是,您正在调用abort(),所以您应该能够从崩溃报告中获取堆栈跟踪和状态信息。

另一件事......看看你是如何生成你的数据库。您应确保以回滚模式(journal_mode = DELETE)生成它。

相关问题