2011-04-12 6 views
1

J'ai un NSManagedObjectModel préexistant que j'ai créé avec l'interface graphique Xcode. Je veux créer une propriété récupérée triée, que l'interface graphique de Xcode 3.2 ne prend pas en charge. Je fais tout cela avant de créer mon NSPersistentStoreCoordinator car je sais que vous ne pouvez pas modifier un NSManagedObjectModel après qu'un gestionnaire de graphes d'objets a commencé à l'utiliser. J'ai créé le NSFetchedPropertyDescription ainsi:Comment créer une NSFetchedPropertyDescription par programme?

NSManagedObjectModel *managedObjectModel = ... // fetch from my mainBundle 

NSEntityDescription *fetchedPropertyEntityDescription = [entitiesByName objectForKey:@"MyEntity"]; 

NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease]; 
[fetchRequest setEntity:fetchedPropertyEntityDescription]; 
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"myPredicateProperty == $FETCH_SOURCE"]]; 
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"mySortProperty" ascending:YES]]]; 

NSFetchedPropertyDescription *fetchedPropertyDescription = [[[NSFetchedPropertyDescription alloc] init] autorelease]; 
[fetchedPropertyDescription setFetchRequest:fetchRequest]; 
[fetchedPropertyDescription setName:@"myFetchedProperty"]; 

NSEntityDescription *entityDescription = [entitiesByName objectForKey:@"MyFetchSourceEntity"]; 

[entityDescription setProperties:[[entityDescription properties] arrayByAddingObject:fetchedPropertyDescription]]; 

Quand j'appelle

[fetchedPropertyDescription setFetchRequest:fetchRequest]; 

Je reçois l'exception suivante:

NSInvalidArgumentException: Can't use fetch request with fetched property description (entity model mismatch). 

Répondre

1

je devais ajouter le NSFetchedPropertyDescription au NSEntityDescription avant de la NSFetchRequest sur le NSFetchedPropertyDescription.

Les mesures appropriées sont ci-dessous:

NSManagedObjectModel *managedObjectModel = ... // fetch from my mainBundle 

NSEntityDescription *fetchedPropertyEntityDescription = [entitiesByName objectForKey:@"MyEntity"]; 

NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease]; 
[fetchRequest setEntity:fetchedPropertyEntityDescription]; 
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"myPredicateProperty == $FETCH_SOURCE"]]; 
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"mySortProperty" ascending:YES]]]; 

NSFetchedPropertyDescription *fetchedPropertyDescription = [[[NSFetchedPropertyDescription alloc] init] autorelease]; 
//DON'T DO THIS HERE, AN ERROR WILL OCCUR 
//[fetchedPropertyDescription setFetchRequest:fetchRequest]; 
// 
[fetchedPropertyDescription setName:@"myFetchedProperty"]; 

NSEntityDescription *entityDescription = [entitiesByName objectForKey:@"MyFetchSourceEntity"]; 

[entityDescription setProperties:[[entityDescription properties] arrayByAddingObject:fetchedPropertyDescription]]; 

//DO THIS HERE INSTEAD 
[fetchedPropertyDescription setFetchRequest:fetchRequest]; 
1

Vous ne pouvez pas modifier un modèle d'objet géré une fois qu'il a été utilisé pour créer un graphe d'objet, c'est-à-dire après qu'il y ait un contexte ou un magasin qui l'utilise. Le modèle définit les propriétés et les relations de tous les objets du graphique. Si vous le changez à la volée, le graphique se transforme en charabia.

Ceci s'applique également aux propriétés récupérées. Des NSFetchProperyDescription docs:

descriptions de propriété sont modifiables Tirée par les cheveux jusqu'à ce qu'ils soient utilisés par un gestionnaire de graphe d'objet . Cela vous permet de créer ou de les modifier dynamiquement. Cependant, une fois qu'une description est utilisée (lorsque le modèle d'objet géré à auquel il appartient est associé à un coordinateur de magasin persistant ), il doit être non (ne peut en effet) pas être modifié. Ce est appliqué au moment de l'exécution: toute tentative de mutation d'un modèle ou de l'un de ses objets après que le modèle est associé à un coordinateur de magasin persistant entraîne l'envoi d'une exception . Si vous avez besoin de modifier un modèle qui est en cours d'utilisation, créez une copie , modifiez la copie, puis supprimer les objets avec l'ancien modèle .

+0

Oui, mais je n'ai pas encore créé NSPersistentStoreCoordinator avec le NSManagedObjectModel. Je vais mettre à jour ma question. –