【问题标题】:CoreData: error: Failed to call designated initializer on NSManagedObject class 'SCTrack'CoreData:错误:无法调用 NSManagedObject 类“SCTrack”上的指​​定初始化程序
【发布时间】:2015-02-05 07:18:33
【问题描述】:

不想问这个问题,因为似乎还有很多其他类似的问题,但在浏览了大部分答案后,我仍然看不出我的问题。

我有两个 VC,VC1 包含从音乐服务获取的歌曲列表。 VC2 包含从 VC1 中挑选的歌曲列表; VC2 基本上是一个播放列表。

我已经设置了我的实体名称和类以匹配:SCTrack。这是我的 SCTrack.h:

@interface SCTrack : NSManagedObject
@property (strong, nonatomic) NSString* title;
@property (strong, nonatomic) NSString* stream_url;

SCTrack.m:

#import "SCTrack.h"
@implementation SCTrack

@dynamic title;
@dynamic stream_url;

-(instancetype) initWithDictionary: (NSDictionary*) SCTrackDict {
self = [self init];
if (self) {
    self.title = SCTrackDict[@"title"];
    self.stream_url = SCTrackDict[@"stream_url"];

}
return self;
}

+(NSMutableArray *) parseJSONData: (NSData *) JSONData {
NSError* error;
NSMutableArray* SCTrackArray = [NSMutableArray new];

NSArray *JSONArray= [NSJSONSerialization JSONObjectWithData:JSONData options:0 error: &error];
if ([JSONArray isKindOfClass:[NSArray class]]) {
    for (NSDictionary* trackDict in JSONArray) {
        SCTrack* trackObject = [[SCTrack alloc]initWithDictionary:trackDict];
        [SCTrackArray addObject:trackObject];
    }
}
return SCTrackArray;
}

@end

我的 AppDelegate.m

 UITabBarController* tabBar = (UITabBarController*) self.window.rootViewController;
SCTrackListVC *SCVC = (SCTrackListVC*) [[tabBar viewControllers]objectAtIndex:2];

SCVC.managedObjectContext = self.managedObjectContext;
return YES;

在我的 VC1.m 中

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
self.selectedTrack = self.SCTrackList[indexPath.row];
self.selectedTrackRow = indexPath.row;

self.selectedTrack = [[SCTrack alloc]initWithEntity:[NSEntityDescription entityForName:@"SCTrack" inManagedObjectContext:self.managedObjectContext]insertIntoManagedObjectContext:self.managedObjectContext];

NSError* error;
NSManagedObjectContext *context = self.managedObjectContext;
if (![context save:&error]) {
    NSLog(@"Error! %@", error);
}

//This is the other way I tried it _selectedTrack = [NSEntityDescription insertNewObjectForEntityForName:@"SCTrack" inManagedObjectContext:self.managedObjectContext];

在我的 VC2.m 中

-(NSFetchedResultsController*) fetchedResultController {
if (_fetchedResultController != nil) {
    return _fetchedResultController;
}

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *SCTrackEntity = [NSEntityDescription entityForName:@"SCTrack" inManagedObjectContext:[self managedObjectContext]];
[fetchRequest setEntity:SCTrackEntity];



//    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES];
//    [fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];

_fetchedResultController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[self managedObjectContext] sectionNameKeyPath:nil cacheName:nil];

_fetchedResultController.delegate = self;

return _fetchedResultController;
}

这是我得到的错误: CoreData:错误:无法调用 NSManagedObject 类“SCTrack”上的指​​定初始化程序

对 Core Data 非常陌生。已经在这里待了几个小时了。感谢您为我指明正确的方向。

【问题讨论】:

    标签: ios core-data


    【解决方案1】:

    NSManaged Object 的指定初始化器是 initWithEntity: insertIntoManagedObjectContext:。 改变

    SCTrack* trackObject = [[SCTrack alloc]initWithDictionary:trackDict];
    

    SCTrack *trackObject = [[SCTrack alloc]initWithEntity:entity insertIntoManagedObjectContext:context];
    

    【讨论】:

    • 啊,我明白了。谢谢。但这不会保存将在 VC1 中填充的每个 SCTrack 吗?不过,我只想保存添加到 VC2 的 SCTrack。
    • 会的。如果您不想保存 NSManaged 对象,为什么要首先初始化它?
    • 我正在初始化它以在 VC1 上显示。我只想从那里挑选一些(VC1)作为播放列表保存到 VC2 中。我只希望播放列表持续存在。我想我正在通过创建一个单独的 CoreData 实体类(称为 SCCoreDataTrack)来代表我的 VC2 的 SCTrack 来找到一个可能的解决方案......但你肯定给了我一个巨大的线索。
    • 如果您不想保存,则可以使用 trackDict 填充 VC1。然后从字典中过滤并保存您要保存的对象。
    • 抱歉,我是 iOS 新手...您能详细说明一下过滤吗?
    猜你喜欢
    • 2014-10-19
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多