Objective c “忽略”;未能在NSManagedObject类上调用指定的初始值设定项
核心数据库跟踪用户信息。目标是使用足够简单的核心数据登录。 模拟应用程序和登录可以完美地工作。 Xcode不显示任何错误或警告 控制台输出显示: 未能调用NSManagedObject类“Login”上的指定初始值设定项 我可以忽略这个输出吗 Login.h和Login.m是由Xcode本身从数据模型创建的 Login.hObjective c “忽略”;未能在NSManagedObject类上调用指定的初始值设定项,objective-c,core-data,nsmanagedobject,Objective C,Core Data,Nsmanagedobject,核心数据库跟踪用户信息。目标是使用足够简单的核心数据登录。 模拟应用程序和登录可以完美地工作。 Xcode不显示任何错误或警告 控制台输出显示: 未能调用NSManagedObject类“Login”上的指定初始值设定项 我可以忽略这个输出吗 Login.h和Login.m是由Xcode本身从数据模型创建的 Login.h #import <Foundation/Foundation.h> #import <CoreData/CoreData.h> @class Use
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@class User;
@interface Login : NSManagedObject {
@private
}
@property (nonatomic, retain) NSString * password;
@property (nonatomic, retain) User *user;
+ (User *)loginWithEmail:(NSString *)email withPassword:(NSString *)password inManagedObjectContext:(NSManagedObjectContext *)context;
@end
我的理解是,您通常不会显式地alloc/init NSManagedObjects或NSManagedObjects的子类-CoreData会根据需要处理托管对象的实例化和释放-但您正在尝试在loginWithEmail方法中alloc/init您自己的子类。这可能就是为什么你会出错
从更广泛的意义上讲,这个实现似乎模糊了应该是干净利落的数据模型(您的NSManagedObject子类)和“登录”的应用程序逻辑之间的界限——因此我建议重新考虑一下您的体系结构,以便更坚定地反映模型-视图-控制器原则!愉快的编码。我现在看到了错误。我现在把它放在登录中,因为它是快速而肮脏的编码,重构将随之而来:)我需要helperLogin来访问实例方法isValidEmail:inManagedObjectContext:我将不得不重新考虑我的架构。非常感谢。刚刚看了一下苹果关于NSManagedObject的文档——如果你看了子类注释:“重要:此方法是NSManagedObject的指定初始值设定项。你不能简单地通过发送init来初始化托管对象。”
#import "Login.h"
#import "User.h"
@interface Login ()
- (User *)isValidEmail:(NSString *)email inManagedObjectContext:(NSManagedObjectContext *)context;
@end
@implementation Login
@dynamic password;
@dynamic user;
- (User *)isValidEmail:(NSString *)email inManagedObjectContext:(NSManagedObjectContext *)context
{
User *user = nil;
NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"User" inManagedObjectContext:context];
request.predicate = [NSPredicate predicateWithFormat:@"email = %@", email];
NSError *error = nil;
user = [[context executeFetchRequest:request error:&error] lastObject];
[request release];
return user;
}
+ (User *)loginWithEmail:(NSString *)email withPassword:(NSString *)password inManagedObjectContext:(NSManagedObjectContext *)context
{
Login *loginHelper = [[Login alloc] init];
User *user = nil;
if ((user = [loginHelper isValidEmail:email inManagedObjectContext:context])) {
if ([user.login.password isEqualToString:password]) {
// correct login
} else {
// invalid password
user = nil;
}
} else {
// user does not exist
user = nil;
}
[loginHelper release];
return user;
}
@end