En primer lugar, quiero decir que no estoy usando subprocesos o contextos múltiples y he leído y trabajado de cada respuesta relacionada que pude encontrar en SO. Tengo un proyecto al que agregué Core Data y encuentro imposible encontrar un error pernicioso. Puedo reproducir el error cada vez usando el siguiente código.Error de datos centrales 133020: problemas al fusionarse en un guardado:
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
OT_Track *track;
track = [[self.tracksArray objectAtIndex: fromIndexPath.row] retain];
[self.tracksArray removeObjectAtIndex: fromIndexPath.row];
[self.tracksArray insertObject:track atIndex: toIndexPath.row];
[track release];
for(int n = 0; n < [self.tracksArray count]; n++) {
track = [self.tracksArray objectAtIndex:n];
track.positionInPlaylist = [NSNumber numberWithInteger:n];
}
if([self.managedObjectContext hasChanges] && ![self.managedObjectContext save:&error]) {
NSLog(@"Unable to Save Core Data Context");
}
}
self.tracksArray es un NSMutableArray rellena a partir de una zona de alcance realizan en viewWillAppear. OT_Track es una entidad definida en mi momd que tiene un campo llamado positionInPlaylist (definido como Integer32). positionInPlaylist almacena la posición de un OT_Track en una OT_Playlist que permite al usuario reordenar elementos en la lista de reproducción.
¡Estaría muy agradecido por cualquier ayuda en esto ya que me está volviendo loco!
el error que estoy recibiendo es ..
************** Error ******** The operation couldn’t be completed. (Cocoa error 133020.)
2012-03-27 13:03:32.578 OneTrack[7693:707] detailedErrors: (null)
2012-03-27 13:03:32.587 OneTrack[7693:707] {
conflictList = (
"NSMergeConflict (0x4018590) for NSManagedObject (0x40d7e60) with objectID '0x40debd0 <x-coredata://3A300D46-4B20-46DA-A82E-0785BFFAFF14/OT_Track/p2642>' with oldVersion = 1 and newVersion = 2 and old cached row = {\n artistName = \"Ladysmith Black Mambazo\";\n disabled = 0;\n persistentID = \"-2511068126837362989\";\n playing = 0;\n playlist = \"0x401a7a0 <x-coredata://3A300D46-4B20-46DA-A82E-0785BFFAFF14/OT_Playlist/p62>\";\n podcast = 0;\n positionInPlaylist = 0;\n trackAutoplay = 0;\n trackEndTime = \"222.563\";\n trackLoop = 0;\n trackMaxTime = \"222.563\";\n trackName = Abezizwe;\n trackPredelay = 0;\n trackSignature = 2;\n trackStartTime = 0;\n trackTempo = 120;\n trackVolume = 1;\n} and new database row = {\n artistName = \"Ladysmith Black Mambazo\";\n disabled = 0;\n persistentID = \"-2511068126837362989\";\n playing = 0;\n playlist = \"0x40188b0 <x-coredata://3A300D46-4B20-46DA-A82E-0785BFFAFF14/OT_Playlist/p62>\";\n podcast = 0;\n positionInPlaylist = 2;\n trackAutoplay = 0;\n trackEndTime = \"222.563\";\n trackLoop = 0;\n trackMaxTime = \"222.563\";\n trackName = Abezizwe;\n trackPredelay = 0;\n trackSignature = 2;\n trackStartTime = 0;\n trackTempo = 120;\n trackVolume = 1;\n}",
"NSMergeConflict (0x4018610) for NSManagedObject (0x40dc990) with objectID '0x40deed0 <x-coredata://3A300D46-4B20-46DA-A82E-0785BFFAFF14/OT_Track/p2645>' with oldVersion = 1 and newVersion = 2 and old cached row = {\n artistName = \"Warren Zevon\";\n disabled = 0;\n persistentID = \"-2511068126837362101\";\n playing = 0;\n playlist = \"0x401ac40 <x-coredata://3A300D46-4B20-46DA-A82E-0785BFFAFF14/OT_Playlist/p62>\";\n podcast = 0;\n positionInPlaylist = 3;\n trackAutoplay = 0;\n trackEndTime = \"223.686\";\n trackLoop = 0;\n trackMaxTime = \"223.686\";\n trackName = \"Accidentally Like A Martyr\";\n trackPredelay = 0;\n trackSignature = 2;\n trackStartTime = 0;\n trackTempo = 120;\n trackVolume = 1;\n} and new database row = {\n artistName = \"Warren Zevon\";\n disabled = 0;\n persistentID = \"-2511068126837362101\";\n playing = 0;\n playlist = \"0x4018420 <x-coredata://3A300D46-4B20-46DA-A82E-0785BFFAFF14/OT_Playlist/p62>\";\n podcast = 0;\n positionInPlaylist = 3;\n trackAutoplay = 0;\n trackEndTime = \"223.686\";\n trackLoop = 0;\n trackMaxTime = \"223.686\";\n trackName = \"Accidentally Like A Martyr\";\n trackPredelay = 0;\n trackSignature = 2;\n trackStartTime = 0;\n trackTempo = 120;\n trackVolume = 1;\n}"
);
}
self.tracksArray está poblada por el siguiente método llamado de viewWillAppear ...
- (BOOL) populateTracksArray {
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"OT_Track" inManagedObjectContext:self.managedObjectContext];
[request setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"positionInPlaylist" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
NSPredicate *fetchPredicate = [NSPredicate predicateWithFormat:@"playlist == %@", currentUserPlaylist];
[request setPredicate:fetchPredicate];
[sortDescriptors release];
[sortDescriptor release];
NSError *error = nil;
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
if (mutableFetchResults == nil) { // Handle the error.
return false;
}
[self setTracksArray:mutableFetchResults];
[mutableFetchResults release];
[request release];
return true;
}
Gracias por su sugerencia Dean. Intenté lo anterior con NSMergeByPropertyObjectTrumpMergePolicy y las cosas se congelaron al guardar: así que probé con NSOverwriteMergePolicy y las cosas se congelaron de nuevo. No estoy seguro de cómo analizar lo que sucede cuando se congela cuando la salida de la consola simplemente se detiene. Añadiré que puedo guardar el contexto después de otras ediciones (por ejemplo, eliminar una pista o lista de reproducción). – amergin
He detectado algo que podría estar causando problemas en el código de intercambio de pistas. He agregado un enlace a una publicación de blog que tiene una solución que podría ayudar. – deanWombourne
Creé la categoría como se sugiere en la publicación del blog, pero no tuvo ningún efecto. Todavía estoy atascado con el error de fusión o una congelación si implemento el mergePolicy. Estoy muy agradecido por su ayuda en esto. – amergin