Magical Record,CoreData,删除记录和重新编号

时间:2013-08-05 22:50:40

标签: objective-c regex core-data predicate magicalrecord

我正在添加从播放列表中删除歌曲(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
    }

}

3 个答案:

答案 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];