我正在尝试播放存储在Core数据中的视频。获取后显示,有一个对象和objects.video返回一个值,但dataString打印出来为null。我不确定我做错了什么。这是播放视频的正确方式还是我可以做得更好?
我在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);
答案 0 :(得分:2)
它只是托管对象的二进制属性。您调用该属性并返回NSData
。从那里你可以用NSData
做任何你想做的事情,而它是记忆。您的问题是,您无法将NSData
转换为NSURL
。 NSURL
是对NSData
是实际数据的数据的引用。
您需要做的是将视频文件存储在SQLite文件之外的磁盘上。然后在Core Data中存储对它的引用(也称为url)。这样您就可以将视频文件与电影播放器一起使用。
正如其他人所说,将视频存储在SQLite文件中是一个坏主意。它将破坏Core Data的性能。
感谢。我没有将视频直接保存到核心数据,而只是复制了视频网址并将其保存为核心数据中的字符串。每当我创建用户使用的视频副本时,我是否应该为应用创建不同的文件夹以存储视频,即使他们删除了上传到核心数据的原始视频,该副本仍保持完整,从而保持对象的完整性在核心数据中。
您的评论不清楚。根据您的问题,您将实际视频存储在Core Data中。根据您显示的输出,您将文件存储在Core Data中。你改变了吗?如果是这样,您应该将视频文件存储在已知位置,并将相对 URL作为字符串存储在核心数据中的该位置。然后,在准备好使用它时,从中构建完整的URL。由于沙盒可以更改,因此无法存储整个URL,因为它将过时。