以前使用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(@"--------------------------------------------");}
- (IBAction)backgoundTapped:(id)sender {
[self.memberAgeTextField resignFirstResponder];
[self.memberNameTextField resignFirstResponder];
}
![](https://img-my.csdn.net/uploads/201303/11/1363013481_6863.png)
程序代码:CoreDataDemo