gpt4 book ai didi

ios - 使用 Core Data 时如何 NSPredicate 建立一对一关系?

转载 作者:行者123 更新时间:2023-11-28 20:09:00 29 4
gpt4 key购买 nike

我有一个包含歌曲、艺术家和专辑实体的核心数据。

歌曲有可选的一对一关系艺术家到艺术家实体和专辑到专辑实体这两个实体都与 Song 实体具有反向关系。

相册有可选的一对一关系艺术家到艺术家实体和可选的一对多关系歌曲到歌曲实体

这两个实体都与 Album 实体具有反向关系。

艺术家有一个可选的一对一关系album 到 Album 实体和可选的一对多关系歌曲到歌曲实体这两个实体都与艺术家实体具有反向关系。

我想获取不同的艺术家姓名并开始这样做

NSArray *getAllArtistArray = [Song findBy:nil orderBy:@"songName asc"]; // fetch all songs in Song entity  

然后我循环它们以找到唯一的艺术家姓名

 for(Song *songItem in getAllArtistArray)
{
BOOL hasDuplicate = [[uniqueArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"%K == %@",@"artist.artistName", songItem.artist.artistName]] count] > 0;
if (!hasDuplicate)//if uniqueArray found artistname, don add songItem
{
[uniqueArray addObject:songItem];
}
}

问题来了:/

我需要找到单个艺术家的歌曲和专辑数量。

//fixed Indention
//this works for finding the song count of individual Artist but is this the right way ?
-(int)searchSongItemCountInSongbasedOnArtist:(NSString *)searchStr //song count of artist
{
NSPredicate *getSearchPred = [NSPredicate predicateWithFormat:@"%K == %@", @"artist.artistName", searchStr];
NSArray *countArray = [Song findBy:getSearchPred orderBy:@"artist.artistName asc"];
[self searchAlbumCountBasedOnArtist:searchStr andSongArray:countArray];

return [countArray count];
}

如何根据艺术家姓名查找个人的专辑数量?MPMediaQuery 可以很容易地做到这一点,我如何使用 NSPredicate 和 coredata 来做到这一点?

-(int)searchAlbumCountBasedOnArtist:(NSString *)searchStr andSongArray:(NSArray *)songArray
{
MPMediaQuery *albumQuery = [MPMediaQuery albumsQuery];
NSArray *albumCollection = [albumQuery collections];
[albumQuery addFilterPredicate: [MPMediaPropertyPredicate predicateWithValue:searchStr
forProperty:MPMediaItemPropertyArtist]];
return [albumCollection count];
}

enter image description here enter image description here enter image description here

专辑

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@class Artist, Song;

@interface Album : NSManagedObject

@property (nonatomic, retain) NSNumber * albumID;
@property (nonatomic, retain) NSString * albumTitle;
@property (nonatomic, retain) NSString * albumTitleEN;
@property (nonatomic, retain) NSSet *artists;
@property (nonatomic, retain) NSSet *songs;
@end

@interface Album (CoreDataGeneratedAccessors)

- (void)addArtistsObject:(Artist *)value;
- (void)removeArtistsObject:(Artist *)value;
- (void)addArtists:(NSSet *)values;
- (void)removeArtists:(NSSet *)values;

- (void)addSongsObject:(Song *)value;
- (void)removeSongsObject:(Song *)value;
- (void)addSongs:(NSSet *)values;
- (void)removeSongs:(NSSet *)values;

@end

歌曲

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@class Album, Artist;

@interface Song : NSManagedObject

@property (nonatomic, retain) NSNumber * acousticness;
@property (nonatomic, retain) NSNumber * danceability;
@property (nonatomic, retain) NSString * deleted;
@property (nonatomic, retain) NSNumber * durationEN;
@property (nonatomic, retain) NSNumber * energy;
@property (nonatomic, retain) NSString * genre;
@property (nonatomic, retain) NSNumber * key;
@property (nonatomic, retain) NSNumber * liveness;
@property (nonatomic, retain) NSNumber * loudness;
@property (nonatomic, retain) NSString * md5Hash;
@property (nonatomic, retain) NSNumber * mode;
@property (nonatomic, retain) NSNumber * mood;
@property (nonatomic, retain) NSNumber * pID;
@property (nonatomic, retain) NSNumber * playbackDuration;
@property (nonatomic, retain) NSString * serverID;
@property (nonatomic, retain) NSString * songName;
@property (nonatomic, retain) NSString * songNameEN;
@property (nonatomic, retain) NSString * songURL;
@property (nonatomic, retain) NSNumber * speechiness;
@property (nonatomic, retain) NSNumber * tempo;
@property (nonatomic, retain) NSNumber * valance;
@property (nonatomic, retain) Album *albums;
@property (nonatomic, retain) Artist *artists;

@end

艺术家

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@class Album, Song;

@interface Artist : NSManagedObject

@property (nonatomic, retain) NSNumber * artistID;
@property (nonatomic, retain) NSString * artistIDEN;
@property (nonatomic, retain) NSString * artistName;
@property (nonatomic, retain) NSString * artistNameEN;
@property (nonatomic, retain) NSSet *albums;
@property (nonatomic, retain) NSSet *songs;
@end

@interface Artist (CoreDataGeneratedAccessors)

- (void)addAlbumsObject:(Album *)value;
- (void)removeAlbumsObject:(Album *)value;
- (void)addAlbums:(NSSet *)values;
- (void)removeAlbums:(NSSet *)values;

- (void)addSongsObject:(Song *)value;
- (void)removeSongsObject:(Song *)value;
- (void)addSongs:(NSSet *)values;
- (void)removeSongs:(NSSet *)values;

@end

非常感谢任何评论/回答!

最佳答案

获取艺术家,然后使用 artist.albums.count

这假设您在 ArtistAlbum 之间有一个名为 albums 的一对多关系,在 Artists 之间有另一个关系而 Song 称为 songs

同样,您可以使用 artist.songs.count 来获取歌曲的数量

这是获取实体数组的通用方法

- (NSArray *)getData:(NSString*)entityName sortField:(NSString*)sortKey predicate:(NSPredicate*)predicate managedObjectContext:(NSManagedObjectContext*)managedObjectContext
{
NSLog(@"getData called");

if (managedObjectContext == nil) {
NSLog(@"Error can't continue with null managedObjectContext");
return nil;
}
if (entityName == nil) {
NSLog(@"Error can't continue with null entityName");
return nil;
}
if (sortKey == nil) { // if its not set then just set it as follows...
NSLog(@"Error can't continue with null sortField");
return nil;
}
NSLog(@" entity is %@", entityName);

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext];
if (entity == nil) {
NSLog(@" error finding entity %@ in class %@", entityName, [self class]);
return nil;
}

[fetchRequest setEntity:entity];

if (predicate)
[fetchRequest setPredicate:predicate];

// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortKey ascending:YES];
NSArray *sortDescriptors =[NSArray arrayWithObjects:sortDescriptor,nil];
[fetchRequest setSortDescriptors:sortDescriptors];

NSError *error = nil;
NSArray *result = [managedObjectContext executeFetchRequest:fetchRequest error:&error];

if (!result) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
return nil;
}

return result;
}

然后获取专辑和歌曲数

- (void)listAllMethod {

NSArray *artists = [self getData:@"Artists" sortField:@"artistName" predicate:nil managedObjectContext:self.managedObjectContext;

for (Artist *artist in artists) {
NSLog(@" artist is %@", artist.artistName);
NSLog(@" album count is %d", [artist.albums.count intValue]);
NSLog(@" song count is %d", [artist.songs.count intValue]);
for (Album *album in artist.albums)
NSLog(@" album is %@", album.albumTitle);
for (Song *song in artist.songs)
NSLog(@" song is %@", song.songName);

}

NSArray *albums = [self getData:@"Albums" sortField:@"albumTitle" predicate:nil managedObjectContext:self.managedObjectContext;

for (Album *album in albums) {
NSLog(@" album is %@", album.albumTitle);
NSLog(@" artist count is %d", [album.artists.count intValue]);
for (Artist *artist in albums.artists)
NSLog(@" artist is %@", artist.artistName);
}

}

关于ios - 使用 Core Data 时如何 NSPredicate 建立一对一关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21010952/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com