2015-11-03 78 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)生成它。

相關問題