Xcode FetchedResultsController返回空数组

Xcode FetchedResultsController返回空数组,xcode,core-data,nsfetchedresultscontroller,nsmanagedobject,cs193p,Xcode,Core Data,Nsfetchedresultscontroller,Nsmanagedobject,Cs193p,我有一个使用CoreDataTableView的fetchedResultsController,我想从中检索信息,问题是我没有从fetchedResultsController中获取任何值,我相信这些值正确地存储在CoreDataTableView中,但我认为我没有正确地检索它们。我有一个单独的文件来存储所有的数据,我有一个类方法可以传回NSManagedObject的上下文,我认为问题可能就在这里。我正在存储NSDictionary的某些值,例如标题、id和图像。这是密码 #import "

我有一个使用CoreDataTableView的fetchedResultsController,我想从中检索信息,问题是我没有从fetchedResultsController中获取任何值,我相信这些值正确地存储在CoreDataTableView中,但我认为我没有正确地检索它们。我有一个单独的文件来存储所有的数据,我有一个类方法可以传回NSManagedObject的上下文,我认为问题可能就在这里。我正在存储NSDictionary的某些值,例如标题、id和图像。这是密码

#import "FlickrVacationViewController.h"
#import "FlickrCoreDataProcess.h"
#import "VacationPhoto+Flickr.h"

@interface FlickrVacationViewController ()
@end

@implementation FlickrVacationViewController

-(void) setupFetchedResultsController{

NSFetchRequest * request = [NSFetchRequest fetchRequestWithEntityName:@"VacationPhoto"];
request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]];

//[FlickrCoreDataProcess shareManagedObject] should share the NSManagedObject
//performFetch gets called here
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:[FlickrCoreDataProcess shareManagedObject].managedObjectContext sectionNameKeyPath:nil cacheName:nil];

NSLog(@"Number of Objects = %i", [[self.fetchedResultsController fetchedObjects] count]);
//This returns 0

NSLog(@"temp array is %@",self.fetchedResultsController.fetchedObjects);
//Array is empty?
}

- (void)viewDidLoad
{
[super viewDidLoad];

[self setupFetchedResultsController];
}

- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}

//This is not called, I think since the fetchedResultsController doesnt have any values
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Vacation Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

// Configure the cell...

VacationPhoto  *vacationPhoto = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSLog(@"text = %@", vacationPhoto.title);
cell.textLabel.text = vacationPhoto.title;

return cell;
}

@end
这是存储数据的文件,这里是传递NSManagedObject的方法

+(UIManagedDocument*) shareManagedObject{

NSURL* url  = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"Default Photo DataBase"];

static UIManagedDocument *doc = nil;

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    doc = [[UIManagedDocument alloc] initWithFileURL:url];
});

return doc;

}
下面是我如何存储文件的

+(VacationPhoto*) photoWithFlickrInfo: (NSDictionary*) flickrInfo inManagedObjectContext: (NSManagedObjectContext*) context{

NSLog(@"Photo To Store =%@", flickrInfo);   
VacationPhoto * photo = nil;

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"VacationPhoto"];
request.predicate = [NSPredicate predicateWithFormat:@"uniqueID = %@", [flickrInfo objectForKey:FLICKR_PHOTO_ID]];
NSSortDescriptor * descriptor = [NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES];
request.sortDescriptors = [NSArray arrayWithObject:descriptor];

NSError *error = nil;
NSArray *matches =  [context executeFetchRequest:request error:&error];

if (!matches || [matches count] > 1) {
    // handle error
} else if ( [matches count] == 0){
    photo = [NSEntityDescription insertNewObjectForEntityForName:@"VacationPhoto" inManagedObjectContext:context];
    photo.placeName = [flickrInfo objectForKey:FLICKR_PHOTO_PLACE_NAME];
    photo.title = [flickrInfo objectForKey:FLICKR_PHOTO_TITLE];
    NSLog(@"title = %@", photo.title);
    photo.uniqueID = [flickrInfo objectForKey:FLICKR_PHOTO_ID];
    NSLog(@"ID = %@", photo.uniqueID);
    photo.imgURL = [[FlickrFetcher urlForPhoto:flickrInfo format:FlickrPhotoFormatLarge] absoluteString];

} else {
    photo = [matches lastObject];
}

return photo;

}

可能没有提到这一点,但我首先创建了一个UITableViewController,然后将其作为CoreDataTableViewController的子类,以便从中调用performFetch和其他类似的函数。

似乎您忘记了调用-save:]来实际保存插入的对象。

似乎您忘记了调用-save:]以实际保存插入的对象。

您似乎缺少对performFetch的调用,以及告诉表格每个节中有多少行的数据源方法。

您似乎缺少对performFetch的调用,以及告诉表格每个节中有多少行的数据源方法。

在[document saveToURL:document.fileURL for SaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL]之后调用storeFile;调用storeFile后,我在[document saveToURL:document.fileURL for SaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL]之后调用它;我首先创建了一个UITableViewController,然后将其作为CoreDataTableViewController的子类,因此应该从中调用performFetch和其他类似的函数。无论您从中继承什么,您仍在调用
initWithFetchRequest:
,然后期望控制器立即获得有效结果,而不告诉它获取任何内容。调用initWithFetchRequest时,会调用CoreDataTableView文件,并在其中调用performFetch,在输入数据之前,我是否必须设置fetchedResultsController?或者我可以输入数据,然后在之后调用fetchedResultsController并获取数据吗?您是否在调用performFetch时设置了断点,以验证是否如您所述发生了这种情况?(我很好奇,因为它听起来很神奇,因为您没有将获取的结果控制器传递给任何其他可能使用它的对象。)是的,我在performFetch中有一个断点,它确实被调用,我不完全确定它是如何被调用的,但当initWithFetchRequest被调用时,CoreDataTableView会被调用并执行Fetch,我首先创建了一个UITableViewController,然后使其成为CoreDataTableViewController的子类,因此performFetch和其他类似的函数应该从中调用。无论您从中继承什么,您仍在调用
initWithFetchRequest:
,然后期望控制器立即获得有效结果,而不告诉它获取任何内容。调用initWithFetchRequest时,会调用CoreDataTableView文件,并在其中调用performFetch,在输入数据之前,我是否必须设置fetchedResultsController?或者我可以输入数据,然后在之后调用fetchedResultsController并获取数据吗?您是否在调用performFetch时设置了断点,以验证是否如您所述发生了这种情况?(我很好奇,因为它听起来很神奇,因为您没有将获取的结果控制器传递给任何其他可能使用它的对象。)是的,我在performFetch中有一个断点,它确实被调用,我不完全确定它是如何被调用的,但是当initWithFetchRequest被调用时,CoreDataTableView被调用并执行Fetch。我想问题是当我设置fetchedResultsController时,我认为传递上下文不起作用,我只是不知道如何修复它,如何在文件之间传递上下文?我认为问题在于,当我设置fetchedResultsController时,我认为传递上下文不起作用,我只是不知道如何修复它如果是,我如何在文件之间传递上下文?