以前使用CoreData都是選擇附帶有CoreData選項的模闆,自己并不知道具體怎麼建立。雖然,這樣可以節省自己寫代碼的時間,但是,有些模闆是沒有附帶使用CoreData的選項的,這就不得不要自己去建立了。
建立一個工程,命名為CoreDataDemo,選擇Single View Application模闆。接下來需要導入CoreData.framework架構,然後在CoreDataDemo-Prefix.pch檔案中加上#import <CoreData/CoreData.h>。完成後的效果如下:
#import <Availability.h>
#ifndef __IPHONE_4_0
#warning "This project uses features only available in iOS SDK 4.0 and later."
#endif
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#endif
選中工程中的Supporting Files,右鍵 -> New File ->CoreData ->Data Model,名字為DormitoryData

建立一個實體,名字為Member,兩個性質:memberAge,memberName,都是String類型的。
右鍵DormitoryData.xcdatamodeld檔案, CoreData -> NSManagedObject subclass
打開AppDelegate.h檔案,需要加3個屬性和一個方法。
#import <UIKit/UIKit.h>
@class ViewController;
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) ViewController *viewController;
@property (strong, nonatomic, readonly) NSManagedObjectContext *managedObjectContext;
@property (strong, nonatomic, readonly) NSManagedObjectModel *managedObjectModel;
@property (strong, nonatomic, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
-(NSURL*)applicationDocumentsDirectory;
@end
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
self.viewController.managedObjectContext = self.managedObjectContext;
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
- (NSURL*)applicationDocumentsDirectory {
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
- (NSManagedObjectContext *)managedObjectContext {
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
_managedObjectContext = [[NSManagedObjectContext alloc] init];
_managedObjectContext.persistentStoreCoordinator = [self persistentStoreCoordinator];
return _managedObjectContext;
}
- (NSManagedObjectModel *)managedObjectModel {
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
_managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
return _managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
NSError *error = nil;
NSURL *url = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Dormitory.sqlite"];
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error]) {
NSLog(@"%s error = %@", __FUNCTION__, [error localizedDescription]);
}
return _persistentStoreCoordinator;
}
界面樣式如下圖所示,建立相應的IBOutle和IBAction并連結:
ViewController.h中的代碼如下(其餘省略)
@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, strong) NSFetchedResultsController *fetchedResultsController;
@property (strong, nonatomic) IBOutlet UITextField *memberNameTextField;
@property (strong, nonatomic) IBOutlet UITextField *memberAgeTextField;
- (IBAction)saveMemberInformation:(id)sender;
ViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Member" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSSortDescriptor *nameSort = [[NSSortDescriptor alloc] initWithKey:@"memberName" ascending:YES];
NSArray *sorts = [NSArray arrayWithObjects:nameSort, nil];
[fetchRequest setSortDescriptors:sorts];
_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"MyDorimitory"];
}
- (IBAction)saveMemberInformation:(id)sender {
NSError *error = nil;
if (self.memberNameTextField.text != nil) {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"memberName contains[cd] %@", self.memberNameTextField.text];
self.fetchedResultsController.fetchRequest.predicate = predicate;
}
if (![self.fetchedResultsController performFetch:&error]) {
NSLog(@"%s error = %@", __FUNCTION__, [error localizedDescription]);
exit(-1);
}
if ([self.fetchedResultsController.fetchedObjects count] < 1){
Member *member = [NSEntityDescription insertNewObjectForEntityForName:@"Member" inManagedObjectContext:self.managedObjectContext];
member.memberName = self.memberNameTextField.text;
member.memberAge = self.memberAgeTextField.text;
if (![self.managedObjectContext save:&error]) {
NSLog(@"%s error = %@", __FUNCTION__, [error localizedDescription]);
}
} else {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示"
message:@"該成員已經加入"
delegate:self
cancelButtonTitle:@"确定"
otherButtonTitles:nil, nil];
[alertView show];
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Member" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSArray *members = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
for (Member *member in members) {
NSLog(@"name = %@", [member valueForKey:@"memberName"]);
NSLog(@"age = %@", [member valueForKey:@"memberAge"]);
}
NSLog(@"--------------------------------------------");
}
其餘代碼不做修改,隻是添加上述代碼。運作一下,嗯...好像儲存按鈕被鍵盤遮擋了。稍作修改一下,在ViewController.xib中選中原先已有的View控件,将其Class修改為UIControl并關聯放發-(void)backgroundTapped:(id)sender;
- (IBAction)backgoundTapped:(id)sender {
[self.memberAgeTextField resignFirstResponder];
[self.memberNameTextField resignFirstResponder];
}
運作效果:
程式代碼:CoreDataDemo