天天看點

自己建立CoreData所需要的相應類

以前使用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

自己建立CoreData所需要的相應類

建立一個實體,名字為Member,兩個性質:memberAge,memberName,都是String類型的。

自己建立CoreData所需要的相應類

右鍵DormitoryData.xcdatamodeld檔案, CoreData -> NSManagedObject subclass

自己建立CoreData所需要的相應類

打開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并連結:

自己建立CoreData所需要的相應類

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];

}

運作效果:

自己建立CoreData所需要的相應類

程式代碼:CoreDataDemo