2

我有一個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和其他類似的函數應該從中調用。

+0

我認爲這個問題是當我設置fetchedResultsController,我認爲通過上下文不起作用,我只是不知道如何解決它,如果是,我將如何傳遞文件之間的上下文? –

回答

0

好像你忘了打電話 - [NSManagedObjectContext保存:]實際保存你插入的對象。

+0

在調用storeFile之後,我在[document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL]之後調用了這個對象; –

0

您似乎缺少對performFetch的調用,還有數據源方法會告訴表中每個節中有多少行。

+0

我首先創建了一個UITableViewController,然後將它作爲CoreDataTableViewController的一個子類,所以performFetch和其他類似的函數應該從中調用。 –

+0

無論你可以繼承什麼,你仍然調用'initWithFetchRequest:',然後期待控制器立即得到有效的結果而不告訴它獲取任何東西。 –

+0

當initWithFetchRequest被調用時,CoreDataTableView文件被調用,並且在那裏調用performFetch,在輸入數據之前是否必須設置fetchedResultsController?或者我可以輸入數據,然後調用fetchedResultsController並獲取它? –