CoreData的使用-1

今天研究了下 CoreData 发现挺方便的,打算以后的项目中就用coredata 代替sqlite。现将使用方法整理如下:

1.新建一个工程,勾选CoreData,这样在生成的工程中,会自动帮你生成必须的代码,不用自己在创建,减少麻烦。

2.生成的coredata相关的代码在AppDelegate中,为了提高复用性,我单独建立一个类

ManagedObjectBase用来进行保存。

 

ManagedObjectBase.h

@interface ManagedObjectBase : NSObject

 //被管理的对象上下文

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;

//被管理的对象模型

@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;

//持久化存储协调者

@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

 - (void)saveContext;

- (NSURL *)applicationDocumentsDirectory;

@end

ManagedObjectBase.m

#import "ManagedObjectBase.h"

@implementation ManagedObjectBase

 

#pragma mark - Core Data stack

 

@synthesize managedObjectContext = _managedObjectContext;

@synthesize managedObjectModel = _managedObjectModel;

@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;

 

 

// 返回应用程序Docment目录的NSURL类型

- (NSURL *)applicationDocumentsDirectory {

    // The directory the application uses to store the Core Data store file. This code uses a directory named "com.polysaas.IosProject" in the application's documents directory.

    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];

}

 

//  返回 被管理的对象模型

- (NSManagedObjectModel *)managedObjectModel {

    if (_managedObjectModel != nil) {

        return _managedObjectModel;

    }

    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"IosProject" withExtension:@"momd"];

    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

    return _managedObjectModel;

}

 

// 返回 持久化存储协调者

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (_persistentStoreCoordinator != nil) {

        return _persistentStoreCoordinator;

    }

    

    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"IosProject.sqlite"];

    //增加版本升级

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:

                             [NSNumber numberWithBool:YES],

                             NSMigratePersistentStoresAutomaticallyOption,

                             [NSNumber numberWithBool:YES],

                             NSInferMappingModelAutomaticallyOption, nil];

    NSError *error = nil;

    NSString *failureReason = @"There was an error creating or loading the application's saved data.";

    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {//原来为nil

        // Report any error we got.

        NSMutableDictionary *dict = [NSMutableDictionary dictionary];

        dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data";

        dict[NSLocalizedFailureReasonErrorKey] = failureReason;

        dict[NSUnderlyingErrorKey] = error;

        error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];

        // Replace this with code to handle the error appropriately.

        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);

        abort();

    }

    

    return _persistentStoreCoordinator;

}

 

//返回 被管理的对象上下文

- (NSManagedObjectContext *)managedObjectContext {

    // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.)

    if (_managedObjectContext != nil) {

        return _managedObjectContext;

    }

    

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];

    if (!coordinator) {

        return nil;

    }

    _managedObjectContext = [[NSManagedObjectContext alloc] init];

    [_managedObjectContext setPersistentStoreCoordinator:coordinator];

    return _managedObjectContext;

}

 

#pragma mark - Core Data Saving support

 

- (void)saveContext {

    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;

    if (managedObjectContext != nil) {

        NSError *error = nil;

        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {

            // Replace this implementation with code to handle the error appropriately.

            // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.

            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);

            abort();

        }

    }

}

3.使用CoreDataDemo.xcdatamodeld进行实体类的编辑 和属性的添加

4.添加完成后需要定义一个与之对应的实体类 User.

@interface User : NSObject

 @property (nonatomic,copy) NSString *name;

@property (nonatomic,assign) NSUInteger age;

@property (nonatomic,assign) BOOL sex;

@end

5. 最重要的步骤就是要操作coredata了,创建一个User Coredata操作类

UserManager

UserManager.m

@implementation UserManager

 static UserManager *sharedManager = nil;

+ (UserManager*)sharedManager

{

    static dispatch_once_t once;

    dispatch_once(&once, ^{

        sharedManager = [[self alloc] init];

        [sharedManager managedObjectContext];

    });

    return sharedManager;

}

 

//插入

-(int) create:(User*)model

{

    NSManagedObjectContext *cxt = [self managedObjectContext];

    User *note = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:cxt];

    

    //保存数据

    //[note setValue: model.name forKey:@"name"];

    note.name = model.name;

    NSError *savingError = nil;

    if ([self.managedObjectContext save:&savingError]){

        NSLog(@"插入数据成功");

    } else {

        NSLog(@"插入数据失败");

        return -1;

    }

    return 0;

}

6.这样一个基本的数据插入就可以进行了,写个代码验证下:

 

    UserManager *userManager = [UserManager sharedManager];

    User *user = [[User alloc] init];

    user.name = @"张三";

    [userManager create:user];

 这样在Document目录下 就会生成数据库了,如图

下篇文章 继续关于 coredata操作

 

posted @ 2015-09-22 11:49  行藏在我  阅读(206)  评论(0编辑  收藏  举报