1

我是IOS开发的新手。目前我正在构建一个 iPad 应用程序,从 web 服务获取数据,将其保存在核心数据库中,并使用 NSFetchedResultController 在表格视图中显示。

问题是什么。在 IOS6 中它就像一个魅力,在 IOS 5.0 中它保存数据但不显示在 tableview 中。它给出了以下错误。

 CoreData: error: Serious application error.  An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:.  The NIB data is invalid. with userInfo (null)

当我在 IOS 5.1 中进行测试时,它什么也没做。它不在表格视图中显示数据,并且数据未存储在核心数据库中。

这就是我所做的。在我看来确实出现了我检查是否有我可以使用的文件。

if (!self.genkDatabase) {  // we'll create a default database if none is set
        NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
        url = [url URLByAppendingPathComponent:@"Default appGenk Database"];
        self.genkDatabase = [[UIManagedDocument alloc] initWithFileURL:url]; // setter will create this for us on disk
    }

然后它去我的二传手。接下来在 usedocument 中将检查我的文档处于哪个状态。

- (void)setGenkDatabase:(UIManagedDocument *)genkDatabase
{
    if (_genkDatabase != genkDatabase) {
        _genkDatabase = genkDatabase;
        [self useDocument];
    }
    NSLog(@"Comes in the setdatabase methode.");
}

    - (void)useDocument
    {
        NSLog(@"Comses in the use document");
        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(@"create");
                [self setupFetchedResultsController];
                NSLog(@"create 2");
                [self fetchNewsIntoDocument:self.genkDatabase];
                NSLog(@"create 3");
            }];
        } else if (self.genkDatabase.documentState == UIDocumentStateClosed) {
            NSLog(@"closed news");
            // exists on disk, but we need to open it
            [self.genkDatabase openWithCompletionHandler:^(BOOL success) {
                [self setupFetchedResultsController];
            }];
        } else if (self.genkDatabase.documentState == UIDocumentStateNormal) {
            NSLog(@"normal");
            // 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];
            NSLog(@"news inserted");
        }
        [document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];
        }];

    });
    dispatch_release(fetchNews);
}

对于 IOS 5.0 中的问题,这是我的 NSFetchResultController 方法。

- (void)setupFetchedResultsController // attaches an NSFetchRequest to this UITableViewController
{
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"News"];
    request.sortDescriptors = [NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"date" ascending:YES],nil];
    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                managedObjectContext:self.genkDatabase.managedObjectContext
                                sectionNameKeyPath:nil
                                cacheName:nil];
}

我正在这样做,就像斯坦福大学 Paul Hegarty 的例子一样。您可以在此处找到Photomania示例。

希望任何人都可以帮助我!

亲切的问候

4

0 回答 0