0

プレイリストから曲 (playlistTrack) を削除する機能を追加しています。各プレイリストトラックにはプレイリストトラック番号が関連付けられているため、曲の再生順序がわかります。したがって、プレイリストトラックを削除した後、新しいプレイリストトラック番号に続くすべてのプレイリストトラックを割り当てる必要があります。

ここにある私のコードは、一度正常に実行された後、コンソールに「'オブジェクト 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

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 のアーキテクチャはあまり効率的ではないと思います。この削除操作には非常に長い時間がかかります (ループ内の複数の検索よりもすべての検索とフェッチ) playlist_track_number

プレイリストからの高速な挿入と削除を作成するには、連結リストまたは二重連結リスト構造を使用できます。各プレイリストトラック アイテムが次の (および前の) アイテムと関係を持つ場合。プレイリスト エンティティでは、ヘッド (およびテール) アイテムとの関係のみを持つことができ、count プロパティを持つこともできます。

またNSOrderedSet、CoreData の 1 対多の関係に使用できます。これにより、インデックスにアイテムを挿入し、インデックスにアイテムを削除できます (ただし、現時点では未解決のバグが多数あります)。

どちらのバリアントでも、playlist_track_numberプロパティなしでトラック番号/順序を持つことができます

于 2013-08-06T00:45:44.303 に答える