从存储在 Core Data 中的 NSData 播放视频

Playing video from NSData stored in Core Data

我正在尝试播放存储在核心数据中的视频。获取后显示,有一个对象和 objects.video returns 一个值,但 dataString 打印出来为空。我不确定我可能做错了什么。这是播放视频的正确方式还是我可以做得更好?

我在 Core Data 中只有一个对象。

我在核心数据中将视频存储为 NSData。我想获取存储的视频并播放。还有其他方法吗?

_context =  [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Activity" inManagedObjectContext:_context];
[fetchRequest setEntity:entity];
// Specify how the fetched objects should be sorted
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"level"
                                                               ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];


NSError *error = nil;
NSArray *fetchResults = [_context executeFetchRequest : fetchRequest error : &error];
if(fetchRequest == nil){
    NSLog(@"Nothing fetched");
}


for (Activity *objects in fetchResults){

    NSLog(@"%@",objects.video);
  prints->  External Data Reference: <self = 0x7bf48750 ; path = FF54B18E-10B3-4B04-81D4-55AC5E2141B9 ; length = 504426>


NSString *dataString = [[NSString alloc] initWithData:objects.video encoding:NSUTF8StringEncoding];
    NSLog(@"%@",dataString);
    NSURL *movieURL = [NSURL URLWithString:dataString];
    NSLog(@"%@",movieURL);
    _moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
    [_moviePlayer.view setFrame:CGRectMake (20, 20, 200 , self.view.bounds.size.height/2)];
    [self.view addSubview:_moviePlayer.view];
    [_moviePlayer play];

}
NSLog(@"%i",fetchResults.count);

它将只是托管对象上的二进制文件 属性。你调用 属性 并且它 returns NSData。从那里你可以用 NSData 做任何你想做的事,而它是记忆。您的问题是无法将 NSData 转换为 NSURLNSURL 是对数据的引用,其中 NSData 是实际数据。

您需要做的是将视频文件存储在 SQLite 文件之外的磁盘上。然后在 Core Data 中存储对它的引用(又名 url)。这样您就可以通过电影播放器​​使用视频文件。

正如其他人所说,将视频存储在 SQLite 文件中是一个坏主意。它会破坏 Core Data 的性能。

更新 1

Thanks. I have not saved the video directly to core data instead just copied the video url and saved it as string in core data. Should I create a different folder for the app to store the videos whenever I create a copy of the videos the users use so even if they delete the original video that was uploaded to core data, the copy remains intact and thus maintaining integrity of the Objects in Core Data.

您的评论不清楚。根据您的问题,您正在将实际视频存储在核心数据中。根据您显示的输出,您将文件存储在核心数据中。你改变了吗?如果是这样,您应该将视频文件存储在已知位置并将 relative URL 作为字符串存储到核心数据中的该位置。然后,当您准备好使用它时,您可以从中构建完整的 URL 。由于沙盒可以更改,因此您无法存储整个 URL,因为它会过时。