浅谈CoreData For IOS

1、简介

Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象。在此数据操作期间,我们不需要编写任何SQL语句,这个有点类似于著名的Hibernate持久化框架,不过功能肯定是没有Hibernate强大的。简单地用下图描述下它的作用:

左边是关系模型,即数据库,数据库里面有张person表,person表里面有id、name、age三个字段,而且有2条记录;

右边是对象模型,可以看到,有2个OC对象;

利用Core Data框架,我们就可以轻松地将数据库里面的2条记录转换成2个OC对象,也可以轻松地将2个OC对象保存到数据库中,变成2条表记录,而且不用写一条SQL语句。

2、常用类

  (1)NSManagedObjectModel(被管理的对象模型)

           相当于实体,不过它包含 了实体间的关系

  (2)NSManagedObjectContext(被管理的对象上下文)

         操作实际内容

        作用:插入数据  查询  更新  删除

  (3)NSPersistentStoreCoordinator(持久化存储助理)

          相当于数据库的连接器

  (4)NSFetchRequest(获取数据的请求)    

        相当于查询语句

  (5)NSPredicate(相当于查询条件)

  (6)NSEntityDescription(实体结构)

  (7)后缀名为.xcdatamodel的包 (模型文件)

    里面的.xcdatamodel文件,用数据模型编辑器编辑

    编译后为.momd或.mom文件,这就是为什么文件中没有这个东西,而我们的程序中用到这个东西而不会报错的原因


3、类之间的关系如下图





4、创建模型文件


 (1) 刚开是创建工程的时候,如果选择了coreData,系统会自动创建一个以工程名命名的模型文件并在appdelegate里创建CoreData所需的对象

 (2) 自己手动创建模型文件


1.选择模板
  

2.添加实体


3.添加Person的2个基本属性



4.添加Card的1个基本属性



5.建立Card和Person的关联关系

        

右图中的表示Card中有个Person类型的person属性,目的就是建立Card跟Person之间的一对一关联关系(建议补上这一项),在Person中加上Inverse属性后,你会发现Card中Inverse属性也自动补上了


这里详细介绍一下关系:1:1 或者 1;N 、N:N等关系

点击创建的关系,在属性面板中设置,设置项如下图:

  


1、设置对应关系:Type

    To One: 对1。

    To Many:对应N。

2、设置删除主题时的方式 Delete Rule

    NO Aciton :主体删除时,关联的目标实体没有任何变化。

    Nullify:主体删除时,关联的目标实体的外键值被置为Null。

    Cascade:主体被删除时,关联的目标实体也被删除。

    Deny:删除主体时,关联的实体依然存在的时候,删除失败,必须先删除关联的目标实体,然后才能删除实体。


5、CoreData相关对象创建的代码


 appDelegate.h文件


#import <UIKit/UIKit.h>

#import <CoreData/CoreData.h>


@interface AppDelegate :UIResponder <UIApplicationDelegate>


@property (strong,nonatomic)UIWindow *window;


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

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

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


- (void)saveContext;

- (NSURL *)applicationDocumentsDirectory;


 appDelegate.m文件

- (void)applicationWillTerminate:(UIApplication *)application {

    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.

    // Saves changes in the application's managed object context before the application terminates.

    [selfsaveContext];

}


#pragma mark - Core Data stack


@synthesize managedObjectContext =_managedObjectContext;

@synthesize managedObjectModel =_managedObjectModel;

@synthesize persistentStoreCoordinator =_persistentStoreCoordinator;


- (NSURL *)applicationDocumentsDirectory {

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

    return [[[NSFileManagerdefaultManager]URLsForDirectory:NSDocumentDirectoryinDomains:NSUserDomainMask]lastObject];

}


- (NSManagedObjectModel *)managedObjectModel {

    // The managed object model for the application. It is a fatal error for the application not to be able to find and load its model.

    if (_managedObjectModel !=nil) {

        return_managedObjectModel;

    }

    NSURL *modelURL = [[NSBundlemainBundle]URLForResource:@"Books"withExtension:@"momd"];

    _managedObjectModel = [[NSManagedObjectModelalloc]initWithContentsOfURL:modelURL];

    return_managedObjectModel;

}


- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    // The persistent store coordinator for the application. This implementation creates and return a coordinator, having added the store for the application to it.

    if (_persistentStoreCoordinator !=nil) {

        return_persistentStoreCoordinator;

    }

    

    // Create the coordinator and store

    

    _persistentStoreCoordinator = [[NSPersistentStoreCoordinatoralloc]initWithManagedObjectModel:[selfmanagedObjectModel]];

    NSURL *storeURL = [[selfapplicationDocumentsDirectory]URLByAppendingPathComponent:@"Books.sqlite"];

   NSError *error = nil;

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

    if (![_persistentStoreCoordinatoraddPersistentStoreWithType:NSSQLiteStoreTypeconfiguration:nilURL:storeURLoptions:nilerror:&error]) {

        // Report any error we got.

        NSMutableDictionary *dict = [NSMutableDictionarydictionary];

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

        dict[NSLocalizedFailureReasonErrorKey] = failureReason;

        dict[NSUnderlyingErrorKey] = error;

        error = [NSErrorerrorWithDomain:@"YOUR_ERROR_DOMAIN"code:9999userInfo: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, [erroruserInfo]);

       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 = [selfpersistentStoreCoordinator];

   if (!coordinator) {

       return nil;

    }

    _managedObjectContext = [[NSManagedObjectContextalloc]init];

    [_managedObjectContextsetPersistentStoreCoordinator:coordinator];

    return_managedObjectContext;

}


#pragma mark - Core Data Saving support


- (void)saveContext {

   NSManagedObjectContext *managedObjectContext =self.managedObjectContext;

   if (managedObjectContext != nil) {

       NSError *error = nil;

       if ([managedObjectContext hasChanges] && ![managedObjectContextsave:&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, [erroruserInfo]);

           abort();

        }

    }

}


6、执行语句的代码

  1、带有条件的查询:

NSFetchRequest *request = [[NSFetchRequestalloc]init];

    NSEntityDescription *entity = [NSEntityDescriptionentityForName:@"NKBooks"inManagedObjectContext:self.appdelegate.managedObjectContext];

    [requestsetEntity:entity];

    

    request.predicate = [NSPredicatepredicateWithFormat:@"author=%@",self.author];

   NSLog(@"名字:%@",self.author.name);

   NSError *error =nil;

    self.bookArray = [[self.appdelegate.managedObjectContextexecuteFetchRequest:requesterror:&error]mutableCopy];

   if (self.bookArray ==nil) {

       NSLog(@"获取FKBook实体时出错: %@,%@",error,[error userInfo]);

    }

 2、删除

NKAuthor *author =self.authorArray[indexPath.row];

        [self.appDelegate.managedObjectContextdeleteObject:author];

       NSError *error;

       //保存删除操作,如果出现错误,显示错误信息

        if (![self.appDelegate.managedObjectContextsave:&error])

        {

           NSLog(@"删除FKAuthor实体出错:%@,%@",error,[erroruserInfo]);

        }

        // authorArray集合中删除该元素

        [self.authorArrayremoveObject:author];

3、插入

NKAuthor *author = [NSEntityDescriptioninsertNewObjectForEntityForName:@"NKAuthor"inManagedObjectContext:self.appDelegate.managedObjectContext];

        author.name = authorName;

        author.authorDesc = authorDesc;

        

       NSError *error =nil;

        if ([self.appDelegate.managedObjectContextsave:&error]) {

            // 使用UIActionSheet提示添加成功

            [[[UIActionSheetalloc]initWithTitle:@"添加成功"delegate:nil

                               cancelButtonTitle:nildestructiveButtonTitle:@"确定"

                               otherButtonTitles:nil,nil]showInView:self.view];

            [self.navigationControllerpopViewControllerAnimated:YES];

            

        }else{

            

           NSLog(@"添加FKAuthor实体出错: %@,%@" , error ,[error userInfo]);

        

        }


4、修改

//获取将要删除的作者

FKAuthor* deleteAuthor = [authorArrayobjectAtIndex:rowNo];

        deleteAuthor.name =@"就是你呀";

NSError *error;

//保存修改操作,如果出现错误,显示错误信息

if (![self.appDelegate.managedObjectContextsave:&error])

{

NSLog(@"删除FKAuthor实体出错:%@,%@",error,[erroruserInfo]);

}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值