2010-05-07 3 views
14

So in der Suche durch Core Data Snippets, fand ich den folgenden Code:Wie man unterschiedliche Werte in Core Data holt?

... 
[request setEntity:entity]; 
[request setResultType:NSDictionaryResultType]; 
[request setReturnsDistinctValues:YES]; 
[request setPropertiesToFetch:[NSArray arrayWithObject:@"<#Attribute name#>"]]; 

// Execute the fetch 
NSError *error; 
id requestedValue = nil; // WTF? This isn't defined or used anywhere 
NSArray *objects = [managedObjectContext executeFetchRequest:request error:&error]; 
if (objects == nil) { 
    // handle the error 
} 

Das ist großartig und scheint perfekt für das, was ich brauche ... aber wie kann man es tatsächlich nutzen? Ich nehme an, da es Wörterbücher zurückgibt, brauche ich einen Schlüssel, um die Werte zu bekommen - aber wo ist der Schlüssel definiert? Ist das die "id requestValue = nil" -Zeile? Wenn ja, wie wird "requestedValue" zum Schlüssel? Xcode gibt mir eine Compiler-Warnung über eine nicht verwendete Variable bei der Deklaration "requestedValue". Ich fühle mich, als würde ich hier etwas vermissen.

Vielen Dank im Voraus für jede Hilfe, die Sie anbieten können.

Antwort

28

requestedValue ist nichts und wird offensichtlich nicht verwendet (vielleicht war es Teil eines anderen Beispiels, das & in diesen Beispielcode geschnitten wurde - wer weiß). Du kannst es einfach ignorieren.

Die Schlüssel für das Wörterbuch sind die gleichen wie die Attribute, die Sie abgerufen haben und die in Ihrem Modell definiert sind. Wenn Sie beispielsweise eine Personenentität mit drei Attributen definiert haben, Name, Alter, Telefonnummer und nur Namen angefordert, sind dies die einzigen Schlüssel mit Daten in Ihren Wörterbüchern. Also:

[request setEntity:entity]; 
[request setResultType:NSDictionaryResultType]; 
[request setReturnsDistinctResults:YES]; 
[request setPropertiesToFetch:[NSArray arrayWithObject:@"name"]]; 

// Execute the fetch 
NSError *error; 
NSArray *objects = [managedObjectContext executeFetchRequest:request error:&error]; 
if (objects == nil) { 
    abort(); 
} 
for(NSDictionary* obj in objects) { 
    NSLog(@"Person: %@", [obj objectForKey:@"name"]); 
} 
// ... 

Also, wenn Sie haben 5 Personen in Ihrem Datenspeicher namens Bob, Sally, Joe, Freida und Sue, würden Sie diese Namen sehen ausdrucken. Wenn Sie eines der anderen Attribute (wie ihr Alter) verwenden möchten, müssten Sie das zu dem Array hinzufügen, das Sie in setPropertiesToFetch: festgelegt haben.

In den meisten Fällen ist es jedoch am besten, das verwaltete Objekt einfach abzurufen. Das Objekt wird fehlerhaft sein, so dass Sie nicht einmal Attribute in den Speicher bringen werden, wenn Sie nicht wirklich darauf zugreifen. Wenn Sie Änderungen an den Objekten vornehmen möchten, können Sie diese auch im Geschäft speichern (mit verwalteten Objekten).

+1

Perfekt - danke für die Hilfe. Die Core Data Snippets sind wirklich nützlich, aber sie lassen ein wenig die Phantasie, wenn Sie ein neuer Benutzer sind. Danke für die Hilfe! – Andy

+4

ein "kleines" zur Fantasie? Sie lassen alles der Fantasie überlassen. Ich verspüre den Drang, mich jedes Mal zu verprügeln, wenn meine einzige Quelle des Wissens die von Apple geschriebenen Dokumente sind. Glücklicherweise gibt es StackOverflow mit einer Menge Tötungsprofis wie Jason Coco und anderen, die uns helfen, die vagen kryptografischen Nachrichten zu verstehen, die Apple in ihren Dokumenten geschrieben hat. Apple macht tolle Produkte, aber ihre Docs saugt Unendlichkeit quadriert + 1. – SpaceDog

+2

Es sieht aus wie SetReturnsDistinctValues ​​wurde zu SetReturnsDistinctResults geändert – mishod