Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 从阵列移动的对象未保存在核心数据中_Objective C_Ios_Core Data - Fatal编程技术网

Objective c 从阵列移动的对象未保存在核心数据中

Objective c 从阵列移动的对象未保存在核心数据中,objective-c,ios,core-data,Objective C,Ios,Core Data,我有一个显示视频的应用程序。下面的代码获取一个视频列表(使用核心数据),将其过滤为仅以前看过的视频,然后查找下一个视频并将其添加到视频列表中 基本上,我不是在显示每一个视频,而是在显示之前观看的视频+下一个应该观看的视频 videos = [[loader loadVideos] mutableCopy]; // Get only the viewed videos NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(vie

我有一个显示视频的应用程序。下面的代码获取一个视频列表(使用核心数据),将其过滤为仅以前看过的视频,然后查找下一个视频并将其添加到视频列表中

基本上,我不是在显示每一个视频,而是在显示之前观看的视频+下一个应该观看的视频

videos = [[loader loadVideos] mutableCopy];

// Get only the viewed videos
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(viewed == YES)"];

NSMutableArray *viewedVideos = [[videos filteredArrayUsingPredicate:predicate] mutableCopy];

Video *lastWatchedVideo = [viewedVideos lastObject];
// The next video will be equal to the video order of the previous video (starting at 1 vs 0)
Video *todaysVideo = [videos objectAtIndex:[lastWatchedVideo.videoOrder intValue]];

[viewedVideos addObject:todaysVideo]; 

用户界面中的一切都正常工作,但对todaysVideo对象的任何更改(例如,将其标记为已查看)都不会保存回数据库。这是因为我将其移动到了另一个阵列吗?

是的,这就是为什么您的更改没有保存到核心数据中。您正在创建核心数据的本地副本并对其进行修改。这不会反映在核心数据中。把你的代码改成这个,看看它是否有效

videos = [loader loadVideos];//You get the videos from core data
// Get only the viewed videos
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(viewed == YES)"];
NSMutableArray *viewedVideos = [videos filteredArrayUsingPredicate:predicate];
Video *lastWatchedVideo = [viewedVideos lastObject];
// The next video will be equal to the video order of the previous video (starting at 1 vs 0)
Video *todaysVideo = [videos objectAtIndex:[lastWatchedVideo.videoOrder intValue]];
todaysVideo.viewed=YES;
//Now that you have modified it save the context
NSError *error=nil;
[context save:&error];

谢谢你的回答。虽然在加载视频时可以对其进行更改,但稍后我需要修改视频。示例:稍后,这些视频对象将添加到UITableView。在didSelectRowAtIndexPath上,我将视频标记为已观看,然后保存。除了作为todaysVideo加载的视频外,这在所有视频上都有效。@NathanBarry我不明白为什么它不适用于todaysVideo,只要您有一个正确的引用。你能分享你试图设置今天视频的代码吗?也许是didSelectRowAtIndexPath?啊,谢谢你给我指出了正确的位置。在didSelectRowAtIndexPath中,我使用的是视频(我所有视频的列表),而不是显示视频(tableView中实际使用的数组)。谢谢