2009-09-01 14 views
6

को ठीक से कॉन्फ़िगर कैसे करें मैं अपने कोड में एक NSFetchedResultsController डाल रहा हूं, इसलिए मुझे अपने तालिका दृश्य डेटा का यह अच्छा स्वचालित अनुभाग मिल गया है।NSFetchedResultsController

तो मैं यह सुनिश्चित करने के लिए एक परीक्षण चला रहा हूं कि सब ठीक से काम करता है। मेरे लगातार स्टोर में मेरे पास एक एकल पुस्तक इकाई है। मैं पहले पुराने तरीके से लाने का प्रयास करूंगा, फिर मैं NSFetchedResultsController का उपयोग करने की कोशिश करूंगा। कोड के 2 ब्लॉक के बीच का अंतर केवल 2 लाइनों है।

कोड बिना NSFetchedResultsController:

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:kBookEntityName inManagedObjectContext:self.managedObjectContext]; 
[request setEntity:entity]; 

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:NO]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[request setSortDescriptors:sortDescriptors]; 
[sortDescriptor release]; 
[sortDescriptors release]; 

    //The following 2 lines will be replaced by the NSFetchedResultsController 
NSMutableArray *mutableFetchResults = [[[self.managedObjectContext executeFetchRequest:request error:nil] mutableCopy] autorelease]; 
Book *result = (Book*)[mutableFetchResults objectAtIndex:0]; 

NSString* title = [result valueForKey:@"title"]; 
NSString* priority = [result valueForKeyPath:@"priority.name"]; 


[request release]; 

अब मैं NSFetchedResultsController के लिए लाइनों में स्थानापन्न:

NSFetchedResultsController* fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"title" cacheName:@"BookList"];                                                                           

Book *result = (Book*)[fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]; 

सुंदर कटौती और शुष्क लगता है। पहला कोड ब्लॉक ठीक से एकल बुक इकाई प्राप्त करता है। NSFetchedResultsController के साथ कोड, हालांकि, नहीं है। इसके बजाय यह शून्य लौटाता है।

मेरा प्रश्न है: क्या मैं इस उदाहरण में NSFetchedResultsController को ठीक से कॉन्फ़िगर कर रहा हूं?

(ध्यान दें, NSFetchedResultsController का fetchedObjects संपत्ति भी नहीं के बराबर है)

उत्तर

13

मुझे लगता है कि आप अभी भी लाने NSFetchedResultsController बताने के लिए वास्तव में प्रदर्शन करने के लिए की जरूरत है:

NSError *error; 
BOOL success = [controller performFetch:&error]; 

(में उदाहरण से लिया NSFetchedResultsController संदर्भ)

एक और चीज जो अजीब लगती है: क्या आप वास्तव में sectionNameKeyPath के रूप में "शीर्षक" का उपयोग करना चाहते हैं? क्या वह मूल रूप से प्रत्येक पुस्तक के लिए एक अलग खंड नहीं बनायेगा?

+0

"शीर्षक" संगठन इसे प्राप्त करने और चलाने के लिए सिर्फ एक परीक्षण है। मैं वास्तव में लेखकों के नाम पर एक महत्वपूर्ण पथ से अनुभाग करना चाहता हूं, लेकिन इसे एक साधारण उदाहरण के साथ काम करना चाहता हूं। –

+0

यह बहुत दुखद है कि मैंने वास्तव में fetch नहीं किया था। मुझे नहीं पता कि मुझे क्यों लगता है कि प्रारंभिकरण पर fetch किया गया था। धन्यवाद –

+0

धन्यवाद, यह मेरी मदद करता है :) – mateusmaso

7

आप, के रूप में follows.The कोड मान लिया गया

NSFetchedResultsController *fetchedResultsController; 
NSManagedObjectContext *managedObjectContext; 

अपने नियंत्रक के शीर्षक में घोषित किया गया है, और कहा कि पहले से ही managedObjectContext ठीक से प्रारंभ कर रहा है केवल एक बार अपने NSFetchedResultsController प्रारंभ करने की जरूरत है।

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    NSError *error; 
    if (![[self fetchedResultsController] performFetch:&error]) { 
     // Handle error 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 

    } 

    NSLog(@"%d objects fetched", [[fetchedResultsController fetchedObjects] count]); 
} 

- (NSFetchedResultsController *)fetchedResultsController { 

    if (fetchedResultsController != nil) { 
     return fetchedResultsController; 

    } 

    /* 
    Set up the fetched results controller. 
    */ 



    // Create the fetch request for the entity. 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    // Edit the entity name as appropriate. 
    NSEntityDescription *entity = [NSEntityDescription entityForName:kBookEntityName inManagedObjectContext:self.managedObjectContext]; 
    [request setEntity:entity]; 

/* Optional settings 

    [request setResultType:NSManagedObjectResultType]; 
    [request setIncludesPropertyValues:YES]; 
    [request setIncludesPendingChanges:NO]; 
    [request setReturnsObjectsAsFaults:NO]; 
*/ 


    // Edit the sort key as appropriate. 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:NO]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[request setSortDescriptors:sortDescriptors]; 
[sortDescriptor release]; 
[sortDescriptors release];; 

    // Edit the section name key path and cache name if appropriate. 
    // nil for section name key path means "no sections". 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:managedObjectContext sectionNameKeyPath:@"title" cacheName:@"BookList"]; 
    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController = aFetchedResultsController; 

    [aFetchedResultsController release]; 
    [request release]; 


    return fetchedResultsController; 
}  
संबंधित मुद्दे