我尝试了很多选项,但找不到解决这个问题的方法.我创建了一个Core Data文件并命名了实体Account,创建了一个名为username的字符串属性.然后将实体的类编辑为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@interface ITAppDelegate : UIResponder @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#import @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@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@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@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
任何帮助赞赏.谢谢.