我是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示例。
希望任何人都可以帮助我!
亲切的问候