+ entityForName:nil不是合法的NSManagedObjectContext参数search实体名称“帐户”

我已经尝试了很多选项,但是找不到解决这个问题的方法。 我创build了一个核心数据文件,并命名实体帐户,创build一个名为用户名的string属性。 然后编辑实体的类到NSManagedObject,不知道这是否正确。 现在,下面的代码在我的LoginViewController中:

- (void)viewDidLoad { [super viewDidLoad]; ITAppDelegate *appDelegate = (ITAppDelegate *)[[UIApplication sharedApplication] delegate]; NSManagedObjectContext *context = appDelegate.managedObjectContext; Account *newAccount = [NSEntityDescription insertNewObjectForEntityForName:@"Account" inManagedObjectContext:context]; [newAccount setValue:@"Jorge" forKey:@"username"]; [newAccount setPassword:@"password"]; NSLog(@"username:%@ password: %@", [newAccount username], [newAccount password]); } 

我遵循这个教程 ,我的代码文件如下所示:

ITAppDelegate.h

 #import <UIKit/UIKit.h> @interface ITAppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel; @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; @end 

ITAppDelegate.m

 #import "ITAppDelegate.h" #import "LoginViewController.h" @implementation ITAppDelegate @synthesize managedObjectContext = _managedObjectContext; @synthesize persistentStoreCoordinator = _persistentStoreCoordinator; @synthesize managedObjectModel = _managedObjectModel; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. return YES; } #pragma mark - Core Data stack - (NSManagedObjectContext *)managedObjectContext { if (_managedObjectContext != nil) { return _managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator != nil) { _managedObjectContext = [[NSManagedObjectContext alloc] init]; [_managedObjectContext setPersistentStoreCoordinator:coordinator]; } return _managedObjectContext; } - (NSManagedObjectModel *)managedObjectModel { if (_managedObjectModel != nil) { return _managedObjectModel; } NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; return _managedObjectModel; } - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (_persistentStoreCoordinator != nil) { return _persistentStoreCoordinator; } return _persistentStoreCoordinator; } @end 

AccountBase.h

 #import <UIKit/UIKit.h> #import <CoreData/CoreData.h> @interface AccountBase : NSManagedObject @property (nonatomic, retain) NSString *username; @end 

AccountBase.m

 #import "AccountBase.h" @implementation AccountBase @dynamic username; @end 

Account.h

 #import "AccountBase.h" #import <CoreData/CoreData.h> @interface Account : AccountBase @property (nonatomic, assign) NSString *password; @end 

Account.m

 #import "Account.h" #import "KeychainHelper.h" @implementation Account - (NSString*)password { if (self.username) return [KeychainHelper getPasswordForKey:self.username]; return nil; } - (void)setPassword:(NSString*)aPassword { if (self.username) [KeychainHelper setPassword:aPassword forKey:self.username]; } - (void)prepareForDeletion { if (self.username) [KeychainHelper removePasswordForKey:self.username]; } @end 

KeychainHelper.h

 #import <Foundation/Foundation.h> @interface KeychainHelper : NSObject + (NSString*)getPasswordForKey:(NSString*)aKey; + (void)setPassword:(NSString*)aPassword forKey:(NSString*)aKey; + (void)removePasswordForKey:(NSString*)aKey; @end 

KeychainHelper.m

 #import "KeychainHelper.h" #import <Security/Security.h> @interface KeychainHelper () + (NSMutableDictionary*)dictionaryForKey:(NSString*)aKey; @end @implementation KeychainHelper static const NSString *ironTrainers = @"com.domain.myapplication"; + (NSMutableDictionary*)dictionaryForKey:(NSString*)aKey { NSData *encodedKey = [aKey dataUsingEncoding:NSUTF8StringEncoding]; NSMutableDictionary *searchDictionary = [NSMutableDictionary dictionary]; [searchDictionary setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; [searchDictionary setObject:encodedKey forKey:(__bridge id)kSecAttrGeneric]; [searchDictionary setObject:encodedKey forKey:(__bridge id)kSecAttrAccount]; [searchDictionary setObject:ironTrainers forKey:(__bridge id)kSecAttrService]; return searchDictionary; } + (NSString*)getPasswordForKey:(NSString*)aKey { NSString *password = nil; NSMutableDictionary *searchDictionary = [self dictionaryForKey:aKey]; [searchDictionary setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit]; [searchDictionary setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData]; CFTypeRef result = NULL; BOOL statusCode = SecItemCopyMatching((__bridge CFDictionaryRef)searchDictionary, &result); if (statusCode == errSecSuccess) { NSData *resultData = CFBridgingRelease(result); password = [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding]; } return (__bridge NSString *)(result); } + (void)removePasswordForKey:(NSString*)aKey { NSMutableDictionary *keyDictionary = [self dictionaryForKey:aKey]; SecItemDelete((__bridge CFDictionaryRef)keyDictionary); } + (void)setPassword:(NSString*)aPassword forKey:(NSString*)aKey { [KeychainHelper removePasswordForKey:aKey]; NSData *encodedPassword = [aPassword dataUsingEncoding:NSUTF8StringEncoding]; NSMutableDictionary *keyDictionary = [self dictionaryForKey:aKey]; [keyDictionary setObject:encodedPassword forKey:(__bridge id)kSecValueData]; SecItemAdd((__bridge CFDictionaryRef)keyDictionary, nil); } @end 

任何帮助赞赏。 谢谢。

 - (NSManagedObjectContext *)managedObjectContext { if (managedObjectContext != nil) return managedObjectContext; NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator != nil) { managedObjectContext = [[NSManagedObjectContext alloc] init]; [managedObjectContext setPersistentStoreCoordinator:coordinator]; } return managedObjectContext; } 
  • 您尚未提供persistentStoreCoordinator的延迟加载实现
  • 所以coordinator永远是nil
  • 所以你总是会从这个方法返回nil
  • 这意味着你总是会得到上面的错误。

解释错误:

+ entityForName:nil不是合法的NSManagedObjectContext参数search实体名称“Account”

读取它并不是很明显,但是这意味着nil不是传递给pipe理对象上下文的合法东西。 一读,它看起来像你在做entityForName:nil但事实并非如此。

要解决这个问题,你需要提供一个有效的持久存储协调器。 我在这里有一个小文章,它解释了你需要build立一个核心数据栈的代码是多less,这可能对你有帮助。

这可能是由于实体名称和类名称不匹配造成的。 确保您的帐户实体在.xcdatamodeld文件中具有适当的类名称。