Core Data的代码实现

在使用Core Data前,要引入”#import <CoreData/CoreData.h>“头文件。

在使用Core Data时,我们是通过NSManagedObjectModel(托管对象模型)NSPersistentStoreCoordinator(持久化存储协调器)NSPersistentStore(持久化存储库)NSManagedObjectContext(托管对象上下文)NSManagedObject(托管对象)等类来操作的。

当然,使用Core Data可以通过两种方法来实现:在创建工程时选择”Use Core Data”,或者自己在控制器中使用。

一.在创建工程时选择”Use Core Data”

此种情况,Xcode会自动帮你创建.xcdatamodeld文件,它也会在AppDelegate文件中以懒加载的方式来创建Core Data使用到的三个类的对象。

其中,Xcode创建的- (NSURL *)applicationDocumentsDirectory;方法用于定位文件位置:

- (NSURL *)applicationDocumentsDirectory {
    //.应用使用这个目录来存储Core Data库文件
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

1.NSManagedObjectModel *managedObjectModel;

- (NSManagedObjectModel *)managedObjectModel {
    if (_managedObjectModel != nil) {
        return _managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CoreData" withExtension:@"momd"];
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return _managedObjectModel;
}

2.NSPersistentStoreCoordinator *persistentStoreCoordinator;


- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreData.sqlite"];
    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:nil error:&error]) {
        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];
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return _persistentStoreCoordinator;
}

3.NSManagedObjectContext *managedObjectContext;

- (NSManagedObjectContext *)managedObjectContext {
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (!coordinator) {
        return nil;
    }
    _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    return _managedObjectContext;
}

以上就是Xcode为我们创建的三个用于操作Core Data的三个对象。

二.手动创建代码来使用Core Data:

手动创建代码来使用Core Data的话,首先在头文件中引入”#import <CoreData/CoreData.h>“头文件,然后创建一个模型文件:

接下来我们使用代码来操作Core Data,代码如下:

1.搭建上下文

//从应用程序包中加载模型文件,"Model"是上图创建的Core Data文件名。
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
   NSManagedObjectModel* model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];


    //传入模型对象,初始化NSPersistentStoreCoordinator
    NSPersistentStoreCoordinator* psc=[[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

    //构建数据库文件的路径
    NSString* docs=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

    //添加持久化存储库,这里使用sqlite作为存储库
    NSError* error=nil;
    NSPersistentStore* store=[psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error];
    if (store==nil) {
        [NSException raise:@"data error" format:@"%@",[error localizedDescription]];
    }

    //初始化上下文,设置persistentStoreCoordinator属性
    NSManagedObjectContext* context=[[NSManagedObjectContext  alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    [context setPersistentStoreCoordinator:psc];

    NSLog(@"ok");



2.添加数据到//传入上下文,创建Person实体对象
NSManagedObject* person=[NSEntityDescription insertNewObjectForEntityForName:@”Person” inManagedObjectContext:context];
//设置Person的属性
[person setValue:@”Ricky” forKey:@”name”];
[person setValue:[NSNumber numberWithInteger:27] forKey:@”age”];

//传入上下文,创建一个Card对象
NSManagedObject* card=[NSEntityDescription insertNewObjectForEntityForName:@"Card" inManagedObjectContext:context];

[card setValue:@"22222" forKey:@"no"];
//设置person和card关系

[person setValue:card forKey:@"card"];

//利用上下文,将数据同步到持久化存储库

NSError* error1=nil;
BOOL success=[context save:&error1];
if (!success) {
    NSLog(@"error1");
}

3.查询数据

//从数据库中查询数据

    NSFetchRequest* request=[[NSFetchRequest alloc] init];
    request.entity=[NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];
    //设置排序

    NSSortDescriptor* sort=[NSSortDescriptor sortDescriptorWithKey:@"age" ascending:NO];
    request.sortDescriptors=[NSArray arrayWithObject:sort];

    //设置过滤条件

    NSPredicate* predicate=[NSPredicate predicateWithFormat:@"name like%@",@"*ick*"];
    request.predicate=predicate;
    NSError* error2=nil;
    NSArray* objs=[context executeFetchRequest:request error:&error2];
    if (error2) {
        NSLog(@"error2");
        return;
    }

    for(NSManagedObject* obj in objs){
        NSLog(@"name=%@",[obj valueForKey:@"name"]);
    }

3.删除数据

//删除实体对象
    [context deleteObject:card];
    NSError* error4;
    [context save:&error4];
    if (error4) {
        NSLog(@"error4");
    }

执行结果为:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值