Iphone 核心数据轻量级迁移不起作用

Iphone 核心数据轻量级迁移不起作用,iphone,ios,objective-c,core-data,nspersistentdocument,Iphone,Ios,Objective C,Core Data,Nspersistentdocument,我有一个处理核心数据的应用程序。目前我使用的是V1.5,在这些版本中,我对核心数据库做了一些更改。在一些人抱怨应用程序仍在崩溃之后,我发现我应该实现核心数据轻量级。现在的问题是,我不知道我在不同的版本中改变了什么 同样是为了处理核心数据,我遵循了斯坦福德大学的视频教程。 当您阅读本教程时,您会发现他不使用appdelegate中生成的标准代码XCODE。我将简略地解释他在做什么 在de视图中将出现我检查是否有托管文档。如果没有,我就创建一个 if (!self.genkDatabase)

我有一个处理核心数据的应用程序。目前我使用的是V1.5,在这些版本中,我对核心数据库做了一些更改。在一些人抱怨应用程序仍在崩溃之后,我发现我应该实现
核心数据轻量级
。现在的问题是,我不知道我在不同的版本中改变了什么

同样是为了处理核心数据,我遵循了斯坦福德大学的视频教程。

当您阅读本教程时,您会发现他不使用appdelegate中生成的标准代码XCODE。我将简略地解释他在做什么

在de
视图中将出现
我检查是否有托管文档。如果没有,我就创建一个

  if (!self.genkDatabase) {
        NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
        url = [url URLByAppendingPathComponent:@"Default appGenk Database"];
        // url is now "<Documents Directory>/Default Photo Database"
        self.genkDatabase = [[UIManagedDocument alloc] initWithFileURL:url]; // setter will create this for us on disk
    }
然后在useDocument中检查文档状态,然后获取数据并将其保存在核心数据库中

- (void)useDocument
{
    if (![[NSFileManager defaultManager] fileExistsAtPath:[self.genkDatabase.fileURL path]]) {
        // does not exist on disk, so create it
        [self.genkDatabase saveToURL:self.genkDatabase.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
            NSLog(@"no database created yet");
             [self fetchNewsIntoDocument:self.genkDatabase];
           [self setupFetchedResultsController];
        }];
    } else if (self.genkDatabase.documentState == UIDocumentStateClosed) {
        // exists on disk, but we need to open it
        NSLog(@"closed");
        [self.genkDatabase openWithCompletionHandler:^(BOOL success) {
            
                [self fetchNewsIntoDocument:self.genkDatabase];
            [self setupFetchedResultsController];     
        }];
    } else if (self.genkDatabase.documentState == UIDocumentStateNormal) {
        // already open and ready to use
        [self setupFetchedResultsController];
    }
}
- (void)fetchNewsIntoDocument:(UIManagedDocument *)document
{
    dispatch_queue_t fetchNews = dispatch_queue_create("news fetcher", NULL);
    dispatch_async(fetchNews, ^{
        NSArray *news           = [GenkData getNews];
     [document.managedObjectContext performBlock:^{
    
        int newsId          = 0;
        for (NSDictionary *genkInfo in news) {
            newsId++;
            [News newsWithGenkInfo:genkInfo inManagedObjectContext:document.managedObjectContext withNewsId:newsId];
        }
     
        [document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];
       }];
    });
   dispatch_release(fetchNews);
}
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores.  It cannot perform a save operation.'
这就是我如何将数据提取到数据库中的方法

- (void)useDocument
{
    if (![[NSFileManager defaultManager] fileExistsAtPath:[self.genkDatabase.fileURL path]]) {
        // does not exist on disk, so create it
        [self.genkDatabase saveToURL:self.genkDatabase.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
            NSLog(@"no database created yet");
             [self fetchNewsIntoDocument:self.genkDatabase];
           [self setupFetchedResultsController];
        }];
    } else if (self.genkDatabase.documentState == UIDocumentStateClosed) {
        // exists on disk, but we need to open it
        NSLog(@"closed");
        [self.genkDatabase openWithCompletionHandler:^(BOOL success) {
            
                [self fetchNewsIntoDocument:self.genkDatabase];
            [self setupFetchedResultsController];     
        }];
    } else if (self.genkDatabase.documentState == UIDocumentStateNormal) {
        // already open and ready to use
        [self setupFetchedResultsController];
    }
}
- (void)fetchNewsIntoDocument:(UIManagedDocument *)document
{
    dispatch_queue_t fetchNews = dispatch_queue_create("news fetcher", NULL);
    dispatch_async(fetchNews, ^{
        NSArray *news           = [GenkData getNews];
     [document.managedObjectContext performBlock:^{
    
        int newsId          = 0;
        for (NSDictionary *genkInfo in news) {
            newsId++;
            [News newsWithGenkInfo:genkInfo inManagedObjectContext:document.managedObjectContext withNewsId:newsId];
        }
     
        [document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];
       }];
    });
   dispatch_release(fetchNews);
}
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores.  It cannot perform a save operation.'
我知道这是很多代码,但我想得到一个好的答案,因为我在这个问题上搜索了好几天。在我听说轻量级核心数据迁移之前,我的appdelegate中没有任何关于核心数据的内容。在研究了轻量级迁移之后,我在appdelegate中添加了标准的核心dat代码,并将其添加到代码中

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }
    
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Default appGenk Database.sqlite"];
    [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil];
    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    NSDictionary *options = @{
                              NSMigratePersistentStoresAutomaticallyOption : @YES,
                              NSInferMappingModelAutomaticallyOption : @YES
                              };
    
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
    
    return _persistentStoreCoordinator;
}
现在,在编写了大量代码之后,我们开始着手解决实际问题。当我在安装了第一个版本的iPad上运行该项目时,在它将数据插入数据库之后,我得到了以下错误

- (void)useDocument
{
    if (![[NSFileManager defaultManager] fileExistsAtPath:[self.genkDatabase.fileURL path]]) {
        // does not exist on disk, so create it
        [self.genkDatabase saveToURL:self.genkDatabase.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
            NSLog(@"no database created yet");
             [self fetchNewsIntoDocument:self.genkDatabase];
           [self setupFetchedResultsController];
        }];
    } else if (self.genkDatabase.documentState == UIDocumentStateClosed) {
        // exists on disk, but we need to open it
        NSLog(@"closed");
        [self.genkDatabase openWithCompletionHandler:^(BOOL success) {
            
                [self fetchNewsIntoDocument:self.genkDatabase];
            [self setupFetchedResultsController];     
        }];
    } else if (self.genkDatabase.documentState == UIDocumentStateNormal) {
        // already open and ready to use
        [self setupFetchedResultsController];
    }
}
- (void)fetchNewsIntoDocument:(UIManagedDocument *)document
{
    dispatch_queue_t fetchNews = dispatch_queue_create("news fetcher", NULL);
    dispatch_async(fetchNews, ^{
        NSArray *news           = [GenkData getNews];
     [document.managedObjectContext performBlock:^{
    
        int newsId          = 0;
        for (NSDictionary *genkInfo in news) {
            newsId++;
            [News newsWithGenkInfo:genkInfo inManagedObjectContext:document.managedObjectContext withNewsId:newsId];
        }
     
        [document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];
       }];
    });
   dispatch_release(fetchNews);
}
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores.  It cannot perform a save operation.'
我希望任何人都能帮助我解决这个问题。我不是一个很长时间的IOS开发者,很难为我解决这个问题


自动轻量级迁移并不总是有效的——它取决于您对数据模型所做的更改。您确定可以将其用于更改吗?我只向实体添加了一些属性。没有大的变化哪一行导致了异常?请在代码中对该行进行注释。另外,您是使用版本化的核心数据模型,还是只是重复编辑单个版本?如果编辑单个版本,您是否在每次更改后将其提交给源代码管理?如果是这样,您应该能够返回版本历史记录以查找所做的更改。如果没有,你应该开始这样做。