2

정보를 검색하려는 CoreDataTableView를 사용하는 fetchedResultsController가 있습니다. 문제는 fetchedresultsController에서 값을 가져 오지 못하는 것입니다. 값이 CoreDataProperly에 저장되어 있다고 생각합니다. 올바르게 검색. 모든 데이터를 저장하는 별도의 파일이 있고 NSManagedObject 컨텍스트를 다시 전달해야하는 클래스 메서드가 있습니다. 문제가 여기에있을 수 있습니다. 제목과 ID 및 이미지와 같은 NSDictionary의 특정 값을 저장합니다. 여기에이 여기에 데이터를 저장하는 파일이빈 배열을 반환하는 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를 호출하고 가져올 수 있습니까? –