我有一個fetchedResultsController使用CoreDataTableView,我想從中檢索信息,問題是我沒有從fetchedresultsController獲取任何值,我相信這些值存儲在CoreDataProperly中,但我不認爲我是正確地檢索它們。我有一個單獨的文件存儲所有的數據,我有一個類方法應該傳回NSManagedObject的上下文,我認爲問題可能在這裏。我存儲一個NSDictionary的某些值,如標題和ID以及圖像。下面是代碼FetchedResultsController返回空陣列
#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和其他類似的函數應該從中調用。
我認爲這個問題是當我設置fetchedResultsController,我認爲通過上下文不起作用,我只是不知道如何解決它,如果是,我將如何傳遞文件之間的上下文? –