核心数据库会跟踪用户信息。目标是使用核心数据登录,这很简单。 模拟应用程序和登录工作完美。 Xcode不会显示任何错误或警告。
控制台输出显示: 无法在NSManagedObject类“Login”上调用指定的初始值设定项 我可以忽略这个输出吗?
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
答案 0 :(得分:1)
我的理解是,您通常不会显式地分配/初始化NSManagedObjects或NSManagedObjects的子类--CoreData会根据需要处理实例化和取消分配托管对象 - 但您尝试在loginWithEmail方法中分配/初始化您自己的子类。所以这可能就是你收到错误的原因。
从广义上讲,这种实现似乎模糊了应该是一个干切数据模型(你的NSManagedObject子类)和“登录”的应用程序逻辑之间的界限 - 所以我建议重新考虑你的架构只是更加坚定地反映了模型 - 视图 - 控制器原理!快乐的编码。