Pourquoi est-ce la Base de Données exemple de s'écraser?
J'ai un modèle où j'ai une Personne de l'entité et une Photo de l'entité. Dans mon Image de l'entité I ont une propriété qui est une relation à une Personne.
Je voudrais avoir un exemple sur la façon d'ajouter une Image à une Personne parce que ce que j'ai fait ne fonctionne pas.
-(BOOL)savePicture:(NSString *)urlPicture:(Person *)person{
SettingsSingleton *userSettings = [SettingsSingleton sharedManager];
NSManagedObjectContext *managedObjectContext = [userSettings managedObjectContext];
NSEntityDescription *myContentEntity = [NSEntityDescription entityForName:@"Pictures" inManagedObjectContext:managedObjectContext];
NSManagedObject *contentToSave = [[NSManagedObject alloc] initWithEntity:myContentEntity insertIntoManagedObjectContext:managedObjectContext];
[contentToSave setValue:urlPicture forKey:@"url"];
[contentToSave setValue:person forKey:@"relatedPerson"];
[managedObjectContext insertObject:contentToSave];
NSError *error;
if ([managedObjectContext save:&error]){
//Deal with errors
NSLog(@"Error");
return NO;
}
return YES;
}
Il se bloque sur la ligne if ([managedObjectContext enregistrer:&erreur]) et dans la console j'ai ces erreurs :
-[UITableViewCell objectID]: unrecognized selector sent to instance 0x135c2b0 Serious application error. Exception was caught during Core Data change processing: ***
-[UITableViewCell objectID]: unrecognized selector sent to instance 0x135c2b0 with userInfo (null) *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '***
-[UITableViewCell objectID]: unrecognized selector sent to instance 0x135c2b0'
et dans ma vue précédente, j'ai le code suivant
- (void)viewDidLoad {
[super viewDidLoad];
SettingsSingleton *settings = [SettingsSingleton sharedManager];
managedObjectContext = [settings managedObjectContext];
fetchedResultsController = [settings fetchedResultsController];
fetchedResultsController.delegate=self;
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
//Handle the error...
}
[settings release];
self.table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 416) style: UITableViewStyleGrouped];
[table setDataSource:self];
table.delegate=self;
[self.view addSubview: self.table];
}
- (NSFetchedResultsController *)fetchedResultsController {
if (fetchedResultsController != nil) {
return fetchedResultsController;
}
Person *personTmp=[[Person alloc] init];
personTmp=[personTmp getPersonById:self.personId];
/*
Set up the fetched results controller.
*/
//Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
//Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Pictures" inManagedObjectContext:managedObjectContext];
NSPredicate *predicate =[NSPredicate predicateWithFormat:@"relatedPerson == %@ AND contentType == %d",personTmp, CONTENT_DATA_PICTURE];
[fetchRequest setEntity:entity];
[fetchRequest setPredicate:predicate];
//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:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
[aFetchedResultsController release];
[fetchRequest release];
[predicate release];
[personTmp release];
return fetchedResultsController;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
if(indexPath.row==0){
cell.textLabel.text=@"Add a picture";
}
else{
int nb=indexPath.row-1;
NSIndexPath *ip = [NSIndexPath indexPathForRow: nb inSection:indexPath.section];
NSManagedObject *managedObject = [fetchedResultsController objectAtIndexPath:ip];
cell.textLabel.text = [[managedObject valueForKey:@"url"] description];
[ip release];
}
return cell;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
int nb=[[fetchedResultsController sections] count];
if (nb == 0) {
nb = 1;
}
return nb;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
NSArray *sections = [fetchedResultsController sections];
NSUInteger count = 0;
if ([sections count]) {
id <NSFetchedResultsSectionInfo> sectionInfo = [sections objectAtIndex:section];
count = [sectionInfo numberOfObjects];
}
return count+1;
}
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vous n'avez pas à appeler 'insertObject'. À partir de l'apple la documentation:
Afin de vous assurer la redondance de l'insertion de l'objet à deux reprises. Pas sûr de ce que les effets négatifs que cela peut avoir, mais il ne peut pas être bon.
Comme pour l'erreur, ça ressemble à quelque autre partie de votre code peut être le coupable. Ce que ce message signifie essentiellement que vous essayez d'accéder à l'CoreData objectID de UITableViewCell. Depuis ce qui se passe lors de l'enregistrement, j'imagine qu'à un certain point avant cette fonction, vous pouvez insérer un UITableViewCell dans le managedObjectContext, alors vous ne soufflez ici en fait, quand vous allez sur pour l'enregistrer.
J'ai eu une erreur similaire se produise. J'ai eu un navController chargement customTypeA viewController d'abord, puis le chargement customTypeB viewController sur le dessus de cela. Ces deux viewControllers utilisé les Données de Base et fetchedResultsControllers que la tableview de la source de données. customTypeB de la fonction pour ajouter un nouvel objet de données à customTypeA de la source de données. Dès lors, je voudrais recevoir le message d'erreur indiquées ci-dessus "
Serious Error in Core Data, Unrecognized Selector. EXC_BAD_ACCESS
", mais mon erreur a déclaré que le non reconnu sélecteur a été "controllerWillChangeContent". Deux de mes viewControllers utilisé la fetchedViewController délégué méthodes "controllerWillChangeContent, controllerDidChangeObject..., controllerDidChangeContent".J'ai remarqué que quand viewControllerB changé controllerA de données, controllerA de fetchedResultsController activé même si controllerB n'avait pas encore été 'sauté'. J'ai donc pensé que peut-être controllerB du délégué qui a été appelé. En regardant les Données de Base de la programmation doc, j'ai vu qu'ils recommandent pour chaque point de vue à l'aide de fetchedResultsController, vous devez mettre en œuvre viewWillDisappear et à l'intérieur, ensemble fetchedResultsController = nil; Pour moi, cela a résolu mon problème.
Aussi FYI - je n'ai pas eu ce problèmes de la fetchedResultsControllers délégués de non-visible viewControllers appelle, avant de installé XCODE 3.2 pour Snow Leopard. Code fonctionnait bien jusqu'à Xcode3.1 Leopard.
self.fetchedResultsController = nil;
. Faire qui a résolu mon problème. Faire enviewWillDisappear:
etviewWillAppear:
est probablement excessif 🙂Serious application error. Exception was caught during Core Data change processing:
pendant des jours, j'ai commencé à googleing et a trouvé cette fois. Le faire dansviewDidDisappear:
etviewWillAppear:
résolu tous mes problèmes. Jouer avec un non-visible NSFetchedResultsController n'truc de dingue. Je ne le recommande pas.