2013-08-05 110 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];