Objective c 神奇记录、CoreData、删除记录并重新编号

Objective c 神奇记录、CoreData、删除记录并重新编号,objective-c,regex,core-data,predicate,magicalrecord,Objective C,Regex,Core Data,Predicate,Magicalrecord,我正在添加从播放列表中删除歌曲(播放曲目)的功能。每个播放曲目都有一个与之关联的播放列表\曲目\编号,因此我们知道歌曲的播放顺序。因此,在删除播放曲目后,我需要分配新播放列表\曲目\编号之后的所有播放曲目,即比其先前的播放列表\曲目\编号少1 我的代码在这里运行了一次,然后在控制台显示“无法在对象3上进行正则表达式匹配”时崩溃。有什么帮助吗 NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCu

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

我的代码在这里运行了一次,然后在控制台显示“无法在对象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
    }

}
NSManagedObjectContext*localContext=[NSManagedObjectContext MR_contextForCurrentThread];
NSPredicate*predicateList=[NSPredicate predicateWithFormat:@“(playlist.name包含[cd]@)”,ActivePlaylist];
NSArray*newArray=[[NSArray alloc]init];
newArray=(NSArray*)[Playlist_Track MR_findAllWithPredicate:predicateList];

对于(int i=(delTrack+1);i与其进行大量不同的获取,不如只进行一次获取以获取所有需要更新的对象,然后对它们进行迭代并执行更新。根据项目的数量,您可以批量获取响应,或者将项目作为错误返回,然后批量保存。

此错误说明您试图使用“NSP”用不合适的类型重新定义
(播放列表\u曲目\u编号匹配[cd]@
我想您正在尝试将数字
播放列表\曲目\数字
与字符串匹配

顺便说一句,我想您的CoreData中的架构不是很有效。 此删除操作将花费很长时间 (查找和获取全部而不是多个查找循环中的一个) 此外,您当前的体系结构不允许在2个或多个播放列表中使用一个播放曲目 因此,最好从playlitrack中删除
playlist\u track\u number
属性

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

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


这两种变体都允许您拥有曲目编号/顺序,而无需
playlist\u track\u number
属性

根据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];

你认为这实际上是导致问题的原因,还是仅仅是一个作为最佳实践的建议?谢谢你的建议,但似乎有很多未解决的错误与解除设置和删除项目。他们已经存在了很长时间,有解决办法,但苹果似乎还没有修复:这是真的。我们仍在等待修复苹果公司的苹果。