2012-03-23 13 views
0

Ich versuche, ein UITableView mit Core Data zu erstellen, indem ich einen holeResultsController verwende.fetchedResultsController fetchedObjects gibt einen NSCFString anstelle von NSArray zurück

Die Abfrage selbst erscheint in Ordnung. Ich teste es über eine executeFetchRequest-Anweisung.

Ich rufe performFetch, ohne Fehler.

Wenn ich versuche, auf geholtObjects zuzugreifen, bekomme ich eine EXC_BAD_ACCESS.

Mit Blick auf die zurückgegebene Variable in Xcode, es scheint, dass es eine _NSCFString anstelle eines NSArray zurückgibt.

Ich habe alles, was ich konnte in Google gesucht, viele Beispiele für diesen Code gefunden und ich kann nicht herausfinden, was ich falsch mache. Ich kann kein Beispiel für das gleiche Problem finden.

Im Folgenden sind die Codeabschnitte:

.h-Datei

@interface MainViewController : UIViewController <NSFetchedResultsControllerDelegate> { 

NSFetchedResultsController *_fetchedResultsController; 
} 

@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController; 

.m-Datei

@synthesize fetchedResultsController = _fetchedResultsController; 

- (NSFetchedResultsController *)fetchedResultsController { 

if (_fetchedResultsController != nil) { 
    return _fetchedResultsController; 
} 

/* 
Set up the fetched results controller. 
*/ 
// Create the fetch request for the entity. 

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Ingredient"]; 
request.predicate = [NSPredicate predicateWithFormat:@"recipe.name = %@",[self theRecipe].name]; 
NSSortDescriptor *aSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"sequenceNumber" ascending:YES]; 
request.sortDescriptors = [NSArray arrayWithObject:aSortDescriptor]; 

NSError *error = nil; 
NSArray *ingredients = [[self managedObjectContext] executeFetchRequest:request error:&error]; 

if (!ingredients) { 
    NSLog(@"** No Ingredients found"); 
} else if ([ingredients count] >= 0) { 
    NSLog(@"**%d Ingredients found", [ingredients count]); 
} 

// 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:[self managedObjectContext] sectionNameKeyPath:nil cacheName:@"myCache"]; 
aFetchedResultsController.delegate = self; 
[self setFetchedResultsController:aFetchedResultsController]; 

return _fetchedResultsController; 
}  

Innen ViewDidLoad

NSError *error = nil; 
if (![[self fetchedResultsController] performFetch:&error]) { 

    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 

NSLog(@"fetchRequest = .... %@",[[self fetchedResultsController] fetchRequest]); 
NSLog(@"fetchedObjects = .... %@",[[self fetchedResultsController] fetchedObjects]); 
NSLog(@"lastObject = .... %@",[[[self fetchedResultsController] fetchedObjects] lastObject]); 
Ingredient *test = [[[self fetchedResultsController] fetchedObjects] lastObject]; 
NSLog(@"test = %@", test.ingredient); 
NSArray *fetchedObjects = [[self fetchedResultsController] fetchedObjects]; // EXC_BAD_ACCESS hit here 
NSLog(@".... ingredients count = %@", [fetchedObjects count]); 

Ergebnis aus meinem executeFetchRequest innen geholt ResultsController Methode

2012-03-24 08:46:23.171 My App[103:707] **8 Ingredients found 

Hier ist die Log-Ausgabe I erhalten:

2012-03-24 08:46:23.186 My App[103:707] fetchRequest = .... <NSFetchRequest: 0x2c5180> (entity: Ingredient; predicate: (recipe.name == "Lasagne"); sortDescriptors: ((
"(sequenceNumber, ascending, compare:)" 
)); type: NSManagedObjectResultType;) 

2012-03-24 08:46:23.192 My App[103:707] fetchedObjects = .... (
"<Ingredient: 0xee23e80> (entity: Ingredient; id: 0xee23100 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p9> ; data: <fault>)", 
"<Ingredient: 0xee24120> (entity: Ingredient; id: 0xee23160 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p3> ; data: <fault>)", 
"<Ingredient: 0xeed59a0> (entity: Ingredient; id: 0xee23170 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p7> ; data: <fault>)", 
"<Ingredient: 0xeed5a00> (entity: Ingredient; id: 0xee23180 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p2> ; data: <fault>)", 
"<Ingredient: 0xee243c0> (entity: Ingredient; id: 0xee23190 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p5> ; data: <fault>)", 
"<Ingredient: 0xee24410> (entity: Ingredient; id: 0xee231a0 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p1> ; data: <fault>)", 
"<Ingredient: 0xee24460> (entity: Ingredient; id: 0xee231b0 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p6> ; data: <fault>)", 
"<Ingredient: 0xee244c0> (entity: Ingredient; id: 0xee231c0 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p8> ; data: <fault>)" 

)

Dies zeigt 8 Ergebnisdatensätze. Das ist, was ich erwarte.

2012-03-24 08:46:23.195 My App[103:707] lastObject = .... <Ingredient: 0xee244c0> (entity: Ingredient; id: 0xee231c0 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p8> ; data: <fault>) 

2012-03-24 08:46:23.198 My App[103:707] test = Salt 

Wieder ist dies der Wert, den ich erwarte.

(gdb) 

Warum ist das Ergebnis fetchedObjects kein NSArray, und wie kann ich es zu machen?

Schätzen Sie jede Hilfe.

Antwort

1

denke ich Ihren Code auf dieser Linie abstürzt:

NSLog(@".... ingredients count = %@", [fetchedObjects count]); 

%@ auf ein Objekt. Es muss %i sein. [fetchedObjects count] gibt eine NSUInteger zurück, die kein Objekt ist. So sollte die Zeile lesen:

NSLog(@".... ingredients count = %i", [fetchedObjects count]); 

Blick auf dieser Seite: String Format Specifiers

+0

Vielen Dank. Das war's. – Scoop