我正在添加从播放列表中删除歌曲(playlistTrack)的功能。每个playlistTrack都有一个与之相关的playlist_track_number,因此我们知道要播放歌曲的顺序。因此,在删除playlistTrack之后,我需要分配新playlist_track_number之后的所有播放列表轨迹,即比之前的playlist_track_number少1个。 / p>
我的代码在这里运行一次,然后在控制台显示“'无法在对象3上进行正则表达式匹配时崩溃”。有什么帮助吗?
NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];
NSPredicate *predicateList = [NSPredicate predicateWithFormat:@"(playlist.name CONTAINS[cd] %@)", activePlaylistString];
NSArray *newArray = [[NSArray alloc]init];
newArray = (NSArray*)[Playlist_Track MR_findAllWithPredicate:predicateList];
for (int i = (delTrack + 1); i <= [newArray count]; i++) {
localContext = [NSManagedObjectContext MR_contextForCurrentThread];
NSString *nextTrackNumberString = [NSString stringWithFormat:@"%i",i];
NSPredicate *nextPredicate = [NSPredicate predicateWithFormat:@"(playlist.name CONTAINS[cd] %@) AND (playlist_track_number MATCHES [cd] %@)", activePlaylistString, nextTrackNumberString];
nextTrack = [Playlist_Track MR_findFirstWithPredicate:nextPredicate inContext:localContext];
if (nextTrack) {
int j = i-1;
nextTrack.playlist_track_numberValue = j;
[localContext MR_saveToPersistentStoreWithCompletion:nil];
}
if (!nextTrack) {
//Do Nothing
}
}
答案 0 :(得分:0)
不要进行大量不同的提取,只需执行一次获取即可获取需要更新的所有对象,然后迭代它们并执行更新。根据项目的数量,您可以从提取中批处理响应或将项目作为故障返回,然后批量保存。
答案 1 :(得分:0)
此错误告诉您尝试使用不合适类型的“NSPredicate”
(playlist_track_number MATCHES [cd] %@)
我想你正在尝试用字符串匹配数字playlist_track_number
。
顺便说一下,我想你的CoreData中的架构效率不是很高。
此删除操作将花费很长时间
(在循环中查找并获取多个查找一个)
此外,您当前的体系结构不允许在2个或更多播放列表中使用一个播放列表跟踪
因此,最好从playlistTrack中删除playlist_track_number
属性
要创建快速插入并从播放列表中删除,您可以使用链接列表或双向链接列表结构。当每个playlistTrack项目与下一个(和上一个)项目有关系时。 在播放列表实体中,您只能与头部(和尾部)项目建立关系,这样才能拥有计数属性。
此外,您可以将NSOrderedSet
用于CoreData中的一对多关系
这将允许您在索引处插入项目,并且在索引处删除项目
(但它目前有很多未解决的错误)
两种变体都允许您拥有没有playlist_track_number
属性
答案 2 :(得分:0)
使用Flop的建议,我按如下方式重新编写代码。这是硬编码的,总是删除索引3处的轨道,但可以通过将参数传递给方法来轻松更改。
NSArray *trackList = [[NSArray alloc]init];
NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];
Playlist *selectedPlaylist;
selectedPlaylist = [Playlist MR_findFirstByAttribute:@"name" withValue:activePlaylistString];
trackList = (NSArray*)selectedPlaylist.playlist_trackSet;
NSMutableArray *newArray = [trackList mutableCopy];
NSUInteger delIndex = 3;
[newArray removeObjectAtIndex:delIndex];
trackList = newArray;
NSOrderedSet *trackSet = (NSOrderedSet*)trackList;
selectedPlaylist.playlist_track = trackSet;
[localContext MR_saveToPersistentStoreWithCompletion:nil];