Vous obtenez le retour normal pour une relation récupérée. Ce que vous avez est un défaut, c'est-à-dire le fantôme d'un objet. Les objets gérés réels ne sont pas chargés jusqu'à ce que vous essayiez d'accéder directement à l'un de leurs attributs. Les données de base utilisent des défauts dans les relations pour éviter d'avoir à charger un grand nombre d'objets dans la mémoire juste pour trouver une petite partie de données.
Supposons que vous ayez une relation avec 1 000 objets gérés de l'autre côté et que vous ayez besoin d'une valeur entière de l'un de ces objets gérés. Sans faille, les données de base devraient charger 1000 objets en mémoire juste pour trouver et récupérer 32 bits de données. En cas de défaut, Core Data connaît où la valeur entière est et peut aller chercher cet objet avec sa valeur unique.
Vous pouvez traiter une propriété récupérée comme une matrice. Prenons le cas de cette sous-classe simple objet géré dans lequel theFetchedProperty
est une propriété tiré par les cheveux avec un prédicat de "TestEntity.order>5"
@interface TestEntityMO : NSManagedObject
{}
@property (nonatomic, retain) NSNumber * order;
@property(nonatomic, retain) NSArray *theFetchedProperty;
Mettre en place comme ceci:
TestEntityMO *testMO;
for (int i=0; i<10; i++) {
testMO=[NSEntityDescription insertNewObjectForEntityForName:@"TestEntity" inManagedObjectContext:self.managedObjectContext];
testMO.order=[NSNumber numberWithInt:i];
}
Ensuite, connectez-vous le dernier objet TestEntityMO créé. La première fois que vous vous connectez la propriété, elle renvoie une erreur:
NSLog(@"testMO.theFetchedProperty == %@",testMO.theFetchedProperty);
sorties
testMO.theFetchedProperty == Relationship fault for (<NSFetchedPropertyDescription: 0x3d19210>), //... rest removed for brevity
...mais vous pouvez vous connecter le compte de la propriété tiré par les cheveux tout comme un tableau:
NSLog(@"[testMO.theFetchedProperty count] == %d",[testMO.theFetchedProperty count]);
... Sorties:
[testMO.theFetchedProperty count] == 4
Vous pouvez obtenir l'objet à un indice comme un tableau:
NSLog(@"[testMO.theFetchedProperty objectAtIndex:0] == %@",[testMO.theFetchedProperty objectAtIndex:0]);
... sorties de la description d'un objet TestEntityMO (qui peut ou peut ne pas être la faute Dans ce cas, non.):
[testMO.theFetchedProperty objectAtIndex:0] == <TestEntityMO: 0x3d20a70> (entity: TestEntity; id: 0x3d20ab0 <x-coredata:///TestEntity/t3A79EE49-39F4-4FCA-8E25-0C28B8E0E01A11> ; data: {
order = 9;
theFetchedProperty = (
0x3d20ab0 <x-coredata:///TestEntity/t3A79EE49-39F4-4FCA-8E25-0C28B8E0E01A11>,
0x3d20a00 <x-coredata:///TestEntity/t3A79EE49-39F4-4FCA-8E25-0C28B8E0E01A10>,
0x3d20880 <x-coredata:///TestEntity/t3A79EE49-39F4-4FCA-8E25-0C28B8E0E01A8>,
0x3d20970 <x-coredata:///TestEntity/t3A79EE49-39F4-4FCA-8E25-0C28B8E0E01A9>
);
})
la journalisation valeur d'un attribut d'un objet aléatoire:
NSLog(@"[[testMO.theFetchedProperty objectAtIndex:0] order] == %@",[[testMO.theFetchedProperty objectAtIndex:1] order]);
... Sorties:
[[testMO.theFetchedProperty objectAtIndex:1] order] == 8
Cependant, si vous vous connectez la propriété récupéré une seconde fois après vous déclenchez le chercher par le code au dessus de vous obtenez un objet réel:
NSLog(@"testMO.theFetchedProperty == %@",testMO.theFetchedProperty);
... Sorties:
testMO.theFetchedProperty == Relationship objects for (
<TestEntityMO: 0x3d20a70> ... ;
data: {
order = 9;
theFetchedProperty = (
0x3d20ab0 <x-coredata:///TestEntity/t3A79EE49-39F4-4FCA-8E25-0C28B8E0E01A11>,
0x3d20a00 <x-coredata:///TestEntity/t3A79EE49-39F4-4FCA-8E25-0C28B8E0E01A10>,
0x3d20880 <x-coredata:///TestEntity/t3A79EE49-39F4-4FCA-8E25-0C28B8E0E01A8>,
0x3d20970 <x-coredata:///TestEntity/t3A79EE49-39F4-4FCA-8E25-0C28B8E0E01A9>
);
}),...
En résumé, vous pouvez:
- Traiter les relations tout comme tirées par les cheveux NSArrays dans le code.
- Comme pour tous les objets gérés, vous verrez souvent une erreur si vous vous connectez directement à l'objet.
Wow, merci! Je dois entrer et essayer ça. – rob5408
Réponse fantastique. Bien qu'une question, les relations ne doivent-elles pas être traitées comme des instances NSSet non NSArray? –
@Marcus - Les récupérations dans les propriétés récupérées renvoient des tableaux, donc je l'ai juste laissé comme ça. – TechZen