0

我正在添加从播放列表中删除歌曲 (playlistTrack) 的功能。每个 playlistTrack 都有一个与之关联的 playlist_track_number,因此我们知道歌曲的播放顺序。因此,在删除 playlistTrack 后,我需要分配新的 playlist_track_number 后面的所有 playlistTrack,即比之前的 playlist_track_number 少 1。

我的代码在这里运行良好一次,然后在控制台显示“'Can't do regex matching on object 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
    }

}
4

3 回答 3

0

与其进行大量不同的提取,只需进行一次提取以获取所有需要更新的对象,然后遍历它们并执行更新。根据项目的数量,您可以批量处理来自获取的响应或将项目作为故障返回,然后批量保存。

于 2013-08-05T23:10:11.383 回答
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];
于 2013-08-06T19:20:18.027 回答
0

此错误告诉您尝试将“NSPredicate”与不适当的类型一起使用 (playlist_track_number MATCHES [cd] %@) 我想您正在尝试将数字playlist_track_number与字符串匹配。

顺便说一句,我想您的 CoreData 中的架构不是很有效。此删除操作将花费很长时间(查找和获取所有内容,而不是循环中的多个查找内容)此外,您当前的架构不允许在 2 个或更多播放列表中使用一个播放列表轨道所以最好playlist_track_number从播放列表轨道中删除属性

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

您也可以NSOrderedSet在 CoreData 中使用一对多关系,这将允许您在索引处插入项目并在索引处删除项目 (但目前有很多未解决的错误)

两种变体都将允许您在没有playlist_track_number财产的情况下拥有轨道编号/订单

于 2013-08-06T00:45:44.303 回答