2011-10-04 71 views
0

核心数据库跟踪用户信息,目标是使用核心数据登录,很简单 模拟应用程序并登录完美 Xcode不显示任何错误或警告忽略“无法在NSManagedObject类上调用指定初始值设定项

控制台输出显示: 未能呼吁NSManagedObject类“登录” 我可以忽略此输出指定初始化?

Login.h和Login.m由Xcode中本身产生数据模型

Login.h

#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 

Login.m

#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 

回答

1

我的理解是,你通常不会分配/初始化NSManagedObjects或NSManagedObjects explicitly- CoreData处理实例,并根据需要重新分配管理对象的子类 - 但你试图在你的loginWithEmail方法中分配/初始化你自己的子类。所以这可能是你得到错误的原因。

从更广泛的意义上说,这个实现似乎模糊了什么应该是一个干净的数据模型(您的NSManagedObject子类)和“登录”的应用程序逻辑之间的界限 - 所以我建议重新考虑您的架构只是一点点,以更坚定地反映模型 - 视图 - 控制器原则!快乐的编码。

+0

我现在看到了错误。我把它放在Login中,因为它是快速和脏的编码,重构将遵循:)我需要helperLogin来访问实例方法isValidEmail:inManagedObjectContext:我将不得不重新考虑我的架构。谢谢 ! – mmvie

+0

刚刚看了一下NSManagedObject的Apple文档 - 如果你看一下子类化笔记:“重要提示:这个方法是NSManagedObject的指定初始化方法,你不能简单地通过发送init来初始化一个托管对象。 – isaac

+0

很高兴能帮到你! – isaac

相关问题