《精通iOS开发·第六版》数据持久化基础知识之CoreData持久化
1、BIDViewController.m文件
#import "BIDViewController.h"
#import "AppDelegate.h"
static NSString *const kLineEntityName = @"lineEntity";
static NSString *const kLineNumberKey = @"lineNumber";
static NSString *const kLineTextKey = @"lineText";
@interface BIDViewController ()
@property(strong,nonatomic)IBOutletCollection(UITextField)NSArray *lineFields;
@end
@implementation BIDViewController
- (void)viewDidLoad {
[super viewDidLoad];
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:kLineEntityName];
NSError *error;
NSArray *objects = [context executeFetchRequest:request error:&error];
if (objects == nil) {
NSLog(@"There was an error!");
}
for (NSManagedObject *oneObject in objects) {
int lineNum = [[oneObject valueForKey:kLineNumberKey] intValue];
NSString *lineText = [oneObject valueForKey:kLineTextKey];
UITextField *theField = self.lineFields[lineNum];
theField.text = lineText;
}
UIApplication *app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:app];
// Do any additional setup after loading the view from its nib.
}
-(void)applicationWillResignActive:(NSNotification *)notification
{
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSError *error;
for (int i=0; i<4; i++) {
UITextField *theField = self.lineFields[i];
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:kLineEntityName];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"(%k = %d)",kLineNumberKey,i];
[request setPredicate:pred];
NSArray *objects = [context executeFetchRequest:request error:&error];
if (objects == nil) {
NSLog(@"There was an error!");
}
NSManagedObject *theLine = nil;
if ([objects count] > 0) {
theLine = [objects objectAtIndex:0];
}else{
theLine = [NSEntityDescription insertNewObjectForEntityForName:kLineEntityName inManagedObjectContext:context];
}
[theLine setValue:[NSNumber numberWithInteger:i] forKey:kLineNumberKey];
[theLine setValue:theField.text forKey:kLineTextKey];
}
[appDelegate saveContext];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
2、BIDViewController.xib文件
注意:如下图
lineFields与XIB中的四个文本输入框链接