Guardar URL de video en Datos básicos

En mi aplicación, utilizo el UIImagePickerController para grabar un video. Luego guardo la URL del video del rollo de la camera en datos básicos, y cada vez que quiero reproducirlo, jalo la URL y lo hago. Sin embargo, cuando el video se elimina de la aplicación de fotos, todavía se reproduce durante un par de días. Cuando no se elimina de la aplicación de fotos, todavía se elimina después de un par de días. ¿Cómo puedo save el video en los documentos de mi aplicación y save una url en los datos centrales? Esto es lo que estoy usando actualmente (no funciona):

Aquí está el file zip que no funciona: http://jmp.sh/v/w4gE5SXNiRd0d7tasc3U

Aquí está el file zip que ahora funciona sin errores: http://jmp.sh/v/tzyJU3nlc1qOPI9ZzDTF

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; // Handle a movie capture if (CFStringCompare((__bridge_retained CFStringRef)mediaType, kUTTypeMovie, 0) == kCFCompareEqualTo) { NSString *moviePath = [NSString stringWithFormat:@"%@", [[info objectForKey:UIImagePickerControllerMediaURL] path]]; NSURL *videoURL = [info objectForKey:UIImagePickerControllerMediaURL]; NSData *videoData = [NSData dataWithContentsOfURL:videoURL]; AppDelegate *appDelegate = [[UIApplication shanetworkingApplication] delegate]; _managedObjectContext = [appDelegate managedObjectContext]; Video *video = [NSEntityDescription insertNewObjectForEntityForName:@"Video" inManagedObjectContext:_managedObjectContext]; ; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; int random = arc4random() % 1000; //[documentsDirectory stringByAppendingFormat:@"/vid1.mp4"] NSString *tempPath = [documentsDirectory stringByAppendingPathComponent: [NSString stringWithFormat:@"vid%d%@%@.mp4", random, self.currentAthlete.first, self.currentAthlete.last]]; BOOL success = [videoData writeToFile:tempPath atomically:NO]; if (success == FALSE) { NSLog(@"Video was not successfully saved."); } else{ ]; } NSError *error = nil; if (![_managedObjectContext save:&error]) { } if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(moviePath)) { UISaveVideoAtPathToSavedPhotosAlbum(moviePath, self, @selector(video:didFinishSavingWithError:contextInfo:), nil); } } [self dismissViewControllerAnimated:YES completion:nil]; } 

No cree una ruta como esta:

 NSString *tempPath = [NSString stringWithFormat:@"%@/vid%d%@%@.mp4", documentsDirectory, random, self.currentAthlete.first, self.currentAthlete.last]; 

crea así:

 NSString *tempPath = [documentsDirectory stringByAppendingPathComponent: [NSString stringWithFormat:@"vid%d%@%@.mp4", random, self.currentAthlete.first, self.currentAthlete.last]]; 

Datos básicos en sí.

Espere, antes de afirmar que no debe almacenar objects binarys grandes directamente en Core Data Store, acepto. No deberías

Sin embargo, hay una opción en Core Data para almacenar datos binarys usando Almacenamiento externo si el file es grande.

introduzca la descripción de la imagen aquí

Ahora, si el file es grande, Core Data se encargará de save el file y almacenar la URL.

Te ahorra la gestión de los files de datos.

Este código escribe el object NSData en el directory de documentos (puede preferir otra location) con la especificación de su URL y luego guarda la misma URL en los datos centrales.

(.marido)

  @property (nonatomic, retain) NSData *data; 

(.metro)

  NSString *docsDir; NSArray *dirPaths; dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); docsDir = [dirPaths objectAtIndex:0]; NSString *databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent:[@"video_" stringByAppendingString:[NSString stringWithFormat: @"%d.mp4", 0]]]]; [self.data writeToFile:databasePath atomically:YES]; NSURL *videoURL = [NSURL fileURLWithPath:databasePath]; if(videoURL) { //save url to core data }