2013-08-05 71 views
0

我添加了从播放列表中删除歌曲(playlistTrack)的功能。每个playlistTrack都有一个与它关联的playlist_track_number,因此我们知道要播放歌曲的顺序。因此,在删除播放列表跟踪后,我需要分配所有播放列表跟踪新播放列表_track_number,即比先前playlist_track_number小1。魔法记录CoreData删除记录并重新编号

我的代码在这里运行良好,然后崩溃与控制台显示“'不能做正则表达式匹配对象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

您是否认为这实际上是造成这个问题,或者它只是一个建议作为最佳实践? – Fluffhead

0

这个错误告诉你试图用“NSPredicate”不适当类型 (playlist_track_number MATCHES [cd] %@) 我想你想匹配号码playlist_track_number用绳子。

顺便说一句,我想在你的CoreData中有一个不是非常有效的架构。 此删除操作将花了很长的时间 (查找和获取所有比多次找到一个在一个循环中) 还您当前的架构不允许使用一个playlistTrack在2个或多个播放列表 所以这是好主意,除去playlist_track_number从playlistTrack

属性创建快速插入和从播放列表中删除您可以使用链表双向链表结构。每个playlistTrack项目与下一个(和前一个)项目有关系时。 在播放列表实体中,您只能与头部(和尾部)项目建立关系,也很适合具有计数属性。

您也可以使用NSOrderedSet一个一对多的关系CoreData 这将让你插入项目索引删除项目索引 (但对当前时刻很多未解决的bug )

两种变体将让你有曲目编号/为了不playlist_track_number财产

+0

感谢您的建议,但似乎有很多与NSOrderedSet unreseedbugs和删除项目。他们已经存在了很长时间,并且有解决方法,但是它似乎苹果尚未修复:http://stackoverflow.com/questions/7385439/exception-thrown-in-nsorderedset-generated-accessors/7922993#7922993 – Fluffhead

+0

的确如此。我们仍在等待苹果的修复。 – Flop

0

使用触发器的建议,我修改了代码,如下所示。这是硬编码的,总是删除索引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];