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

相關問題