2011-07-22 4 views
3

Mon modèle de base de données ne sauvegarde tout simplement pas. Je peux insérer un type d'objet (Graphique - voir ci-dessous), et l'enregistrement fonctionnera. Je peux ajouter plusieurs copies de ce genre d'objet et l'enregistrement fonctionnera. Lorsque j'insère un autre objet, l'une, il échoue, le plus souvent avec ceci:Les données de base EXC_BAD_ACCESS échouent lors de la sauvegarde?

#2 0x00007fff86c342c8 in -[NSManagedObjectContext(_NSInternalAdditions) _changeIDsForManagedObjects:toIDs:]() 

Les autres objets ne sont pas compliqué: il suffit de valeurs String et Number. Leurs valeurs sont définies au moment de la sauvegarde. J'ai réduit le programme uniquement à l'initialisation du NSPersistentDocument: ce qui suit est le code correspondant appelé initWithType:error: dans ma sous-classe NSPersistentDocument:

... 

// Disable undo registration before inserting default objects 
[[[self managedObjectContext] undoManager] disableUndoRegistration]; 

// Insert the root graph 
self.root = [NSEntityDescription insertNewObjectForEntityForName:@"Graph" inManagedObjectContext:[self managedObjectContext]]; 
self.root.createdDate = [NSDate date]; 
self.root.lastModifiedDate = [NSDate date]; 
self.root.name = @"Untitled Model"; 
self.root.colour = [NSColor colorWithDeviceRed:0.6 green:0.6 blue:0.6 alpha:1.0]; 

// Insert default drawing parameters 
// fails when including this line 
self.drawing = [NSEntityDescription insertNewObjectForEntityForName:@"Drawing" inManagedObjectContext:[self managedObjectContext]]; 

[[self managedObjectContext] processPendingChanges]; 
[[[self managedObjectContext] undoManager] enableUndoRegistration]; 

... 

Lors de l'exécution, je reçois:

2011-07-23 07:46:58.012 Z2[15774:a0f] Managed Object Context: <NSManagedObjectContext: 0x2000c65e0> 
2011-07-23 07:46:58.013 Z2[15774:a0f] Persistent Store Coordinator: <NSPersistentStoreCoordinator: 0x200063700> 
2011-07-23 07:46:58.013 Z2[15774:a0f] Entity: Graph 
...<full Entity list> 
2011-07-23 07:46:58.016 Z2[15774:a0f] Entity: Drawing 
2011-07-23 07:46:58.018 Z2[15774:a0f] Object: <Graph: 0x20004e220> (entity: Graph; id: 0x20003e400 <x-coredata:///Graph/t527187E0-DC67-4A9E-BA88-67A4CD3445222> ; data: { 
colour = "(...not nil..)"; 
createdDate = "2011-07-22 21:46:54 +0000"; 
errorString = nil; 
firstDate = nil; 
lastDate = nil; 
lastModifiedDate = "2011-07-22 21:46:54 +0000"; 
lines = (); 
name = "Untitled Model"; 
nodes = (); 
profiles = (); 
test = 0; 
warningString = nil; 
}) 
2011-07-23 07:46:58.019 Z2[15774:a0f] Object: <Drawing: 0x20004f140> (entity: Drawing; id: 0x200062280 <x-coredata:///Drawing/t527187E0-DC67-4A9E-BA88-67A4CD3445223> ; data: { 
centrex = 0; 
centrey = 0; 
textSize = 12; 
typeface = "Helvetica Neue"; 
zoomFactor = 1; 
}) 
Program received signal: “EXC_BAD_ACCESS”. 

Chaque entité a sa propre classe qui sous-classe NSManagedObject. Chaque attribut est défini comme une propriété dynamique. Chaque attribut a une valeur par défaut, où il est raisonnable de les avoir.

J'ai vu d'autres suggérer une sur-libération pour ce type de problème, mais je n'effectue pas de rétention et de libération nulle part dans le code de données de base. Peu importe quelle entité je choisis d'insérer après l'objet graphique; ils échouent tous.

Le travail des données de base est effectué par un cadre (graphique). Le cadre est appelé à partir d'une application basée sur un document (Z) qui sous-classe l'objet de création de document de la structure.

est ici la trace de la pile de la fin du panneau d'enregistrement:

Program received signal: “EXC_BAD_ACCESS”. 
sharedlibrary apply-load-rules all 
(gdb) bt 
#0 0x00007fff80352480 in CFDictionarySetValue() 
#1 0x00007fff86c0b2ed in _PFCMT_SetValue() 
#2 0x00007fff86c342c8 in -[NSManagedObjectContext(_NSInternalAdditions) _changeIDsForManagedObjects:toIDs:]() 
#3 0x00007fff86c44b2b in -[NSSQLCore commitChanges:]() 
#4 0x00007fff86c3926e in -[NSSQLCore saveChanges:]() 
#5 0x00007fff86bfcc8b in -[NSSQLCore executeRequest:withContext:]() 
#6 0x00007fff86bfc051 in -[NSPersistentStoreCoordinator(_NSInternalMethods) executeRequest:withContext:]() 
#7 0x00007fff86c3in -[NSManagedObjectContext save:]() 
#8 0x00007fff8144179d in -[NSPersistentDocument writeToURL:ofType:forSaveOperation:originalContentsURL:error:]() 
#9 0x0000000100020460 in -[GraphDocument writeToURL:ofType:forSaveOperation:originalContentsURL:error:] (self=0x2000c4be0, _cmd=0x7fff816eb6ce, absoluteURL=0x20004eec0, typeName=0x20000ea80, saveOperation=1, absoluteOriginalContentsURL=0x0, outError=0x7fff5fbfe308) at /<path to>/GraphDocument.m:380 
#10 0x00000001000010bc in -[ZDocument writeToURL:ofType:forSaveOperation:originalContentsURL:error:] (self=0x2000c4be0, _cmd=0x7fff816eb6ce, absoluteURL=0x20004eec0, typeName=0x20000ea80, saveOperation=1, absoluteOriginalContentsURL=0x0, outError=0x7fff5fbfe308) at /<path to>/ZDocument.m:110 
#11 0x00007fff81316bd2 in -[NSDocument _writeSafelyToURL:ofType:forSaveOperation:error:]() 
#12 0x00007fff81315fd0 in -[NSDocument writeSafelyToURL:ofType:forSaveOperation:error:]() 
#13 0x00007fff814406dc in -[NSPersistentDocument writeSafelyToURL:ofType:forSaveOperation:error:]() 
#14 0x00007fff81311356 in -[NSDocument saveToURL:ofType:forSaveOperation:error:]() 
#15 0x00007fff81314404 in -[NSDocument _saveToURL:ofType:forSaveOperation:delegate:didSaveSelector:contextInfo:]() 
#16 0x00007fff81311637 in -[NSDocument saveToURL:ofType:forSaveOperation:delegate:didSaveSelector:contextInfo:]() 
#17 0x00007fff8131377c in -[NSDocument _savePanelWasPresented:withResult:inContext:]() 
#18 0x00007fff8148335e in -[NSSavePanel _didEndSheet:returnCode:contextInfo:]() 
#19 0x00007fff81227d45 in -[NSApplication endSheet:returnCode:]() 
+0

Pouvez-vous insérer un objet 'Drawing' si vous n'insérez pas d'objet' Graph'? – TechZen

+0

Vous arrêtez-vous sur toutes les exceptions? Je me demande si une erreur est soulevée avant que vous obteniez le point où vous obtenez le EXC_BAD_ACCESS. – paulmelnikow

Répondre

0

Comme il échoue sur le changement d'ID d'objet, je vais deviner le problème est une relation. Très probablement le problème est avec une relation requise, une règle de suppression ou une validation.

+0

Certaines entités ne sont liées à aucune autre entité. Il n'y a pas de règles de suppression, et la validation est limitée à ce qui est dans l'EDI: maximum, minimum et valeurs par défaut pour les nombres, pas de validation sur les chaînes. – Conbobulate

Questions connexes