使用CoreData [2]

使用CoreData [2]

此篇讲解CoreData处理关系型数据.

 

1. 先创建出Student于Teacher的实体.

 

2. 确定关系,并修改描述

 

3. 创建对象,并查看一下关系(Teacher与Student之间是有着关联关系的哦)

 

4. 测试代码.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSLog(@"%@", NSHomeDirectory());

    // 创建老师的实体
    Teacher *KongZi = [self createTeacher:@"KongZi"];

    // 创建学生的实体并添加到老师的实体当中
    NSArray *students =  @[@{@"name":@"王力宏", @"age":@11},
                           @{@"name":@"张惠妹", @"age":@8},
                           @{@"name":@"井冈山", @"age":@10}];
    [students enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        Student *student = [self createStudent:obj[@"name"] age:obj[@"age"]];

        [KongZi addStudentsObject:student];
    }];

    // 存储信息
    [self saveContext];

    return YES;
}

- (Student *)createStudent:(NSString *)name age:(NSNumber *)age
{
    // 实体描述信息
    NSEntityDescription *description = \
    [NSEntityDescription entityForName:@"Student"
                inManagedObjectContext:[self managedObjectContext]];

    // 初始化对象
    Student *student = [[Student alloc] initWithEntity:description
                        insertIntoManagedObjectContext:[self managedObjectContext]];
    student.name     = name;
    student.age      = age;

    return student;
}

- (Teacher *)createTeacher:(NSString *)name
{
    // 实体描述信息
    NSEntityDescription *description = \
    [NSEntityDescription entityForName:@"Teacher"
                inManagedObjectContext:[self managedObjectContext]];

    // 初始化对象
    Teacher *teacher = [[Teacher alloc] initWithEntity:description
                        insertIntoManagedObjectContext:[self managedObjectContext]];
    teacher.name     = name;

    return teacher;
}

5. 验证关系型数据

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSLog(@"%@", NSHomeDirectory());

    // 设定要查询的实体
    NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"Teacher"];

    // 取出查询结果
    NSArray *teachers = [[self managedObjectContext] executeFetchRequest:fetch error:nil];

    // 遍历出所有老师
    [teachers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        Teacher *teacher = obj;

        // 获取该老师所有的学生
        [[teacher students] enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
            Student *student = obj;
            NSLog(@"%@ %@", student.age, student.name);

            Teacher *tmp = (Teacher *)student.teacher;
            NSLog(@"老师是: %@", tmp.name);
        }];
    }];

    return YES;
}

*6. 验证存在两个老师的情形

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // 本人意淫一回当老师
    Teacher *YouXianMing = [self createTeacher:@"游贤明"];

    // 设定要查询的实体
    NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"Teacher"];

    // 取出查询结果
    NSArray *teachers = [[self managedObjectContext] executeFetchRequest:fetch error:nil];

    // 遍历出所有老师
    [teachers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        Teacher *teacher = obj;

        // 获取该老师所有的学生
        [[teacher students] enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
            Student *student = obj;

            // 添加一个学生后就停止
            [YouXianMing addStudentsObject:student];
            *stop = YES;
        }];
    }];

    // 存储信息
    [self saveContext];

    return YES;
}

执行上述代码之后在执行下述代码.

下图表明了这个原因:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // 设定要查询的实体
    NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"Teacher"];

    // 取出查询结果
    NSArray *teachers = [[self managedObjectContext] executeFetchRequest:fetch error:nil];

    // 遍历出所有老师
    [teachers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        Teacher *teacher = obj;

        // 获取该老师所有的学生
        [[teacher students] enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
            Student *student = obj;
            Teacher *tmp = (Teacher *)student.teacher;

            NSLog(@"%@ %@", student.age, student.name);
            NSLog(@"老师是: %@", tmp.name);
        }];
    }];

    return YES;
}

附录:

如果想修改多对多,请以下图为参考

上图那么修改了之后就会变成下图所示的多对多了,一个学生也可以有好几个老师了.

以上就讲完了关系型数据:)

时间: 2024-07-30 13:22:46

使用CoreData [2]的相关文章

xcode-在Xcode6.1与6.2版本使用CoreData遇到的属性更新问题

问题描述 在Xcode6.1与6.2版本使用CoreData遇到的属性更新问题 在新版Xcode中使用CoreData时, 创建model中实体的实体类时, 新生成的类会包含model中实体的属性, 但我将model中的实体属性更新后重新生成的实体类中的属性就不更新了, 这中情况怎么办 解决方案 参考:http://blog.csdn.net/zsomsom/article/details/9246827

使用开源库 MagicalRecord 操作 CoreData

MagicalRecord  https://github.com/magicalpanda/MagicalRecord 注意:  MagicalRecord 在 ARC 下运作,Core Data 是 ORM 方案,据说带来的麻烦比好处多,且 Core Data 建立的表没有主键,但对于对数据库没有性能要求,进行简单的数据操作完全够用,能简化无数的代码量. MagicalRecord In software engineering, the active record pattern is a

CoreData的增删改查概述

近几天一直在使用 CoreData, 以前觉得它是一门高深的技术, 等自己用了之后才觉得,它是那么的平易近人. 一: 首先我们要在创建应用程序的时候勾选 UseCoreData 选项, 当然也可以自己后期创建. 系统会生成如下AppDelegate.h的文件 #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic

使用coredata和sqlite

首先,coredata和sqlite的概念不同,core为对象周期管理,而sqlite为dbms. 下面的讨论以使用core data来做数据持久化并使用sqlite做backend存储的情况为前提. 使用方便性.实际上,一个成熟的工程中一定是对数据持久化进行了封装的,因此底层使用的到底是core data还是sqlite,不应该被业务逻辑开发者关心.因此,即使习惯写SQL查询的人,也应该避免在业务逻辑中直接编写SQL语句. 存储性能,在写入性能上,因为都是使用的sqlite格式作为磁盘存储格式

iOS中CoreData数据管理系列一——初识CoreData

iOS中CoreData数据管理系列一--初识CoreData 一.何为CoreData     CoreData是一个专门用来管理数据的框架,其在性能与书写方便上都有很大的优势,在数据库管理方面,apple强烈推荐开发者使用CoreData框架,在apple的官方文档中称,使用CoreData框架可以减少开发者50%--70%的代码量,这虽然有些夸张,但由此可见,CoreData的确十分强大. 二.设计数据模型     在iOS开发中,时常使用SQL数据库对大量的表结构数据进行处理,但是SQL

ios开发-Swift2.0如何使用CoreData多线程频繁执行数据库读写

问题描述 Swift2.0如何使用CoreData多线程频繁执行数据库读写 在一个采用Swift2.0编写的IOS APP项目中,需要后台用蓝牙实时获取数据并保存到本地SQLite中进行处理.目前有两个后台线程A和B,A每秒获取一下蓝牙数据,将其保存到数据库中:B定时循环执行遍历数据库,对没有处理的数据进行处理,并更新记录的标志位说明已经处理过.项目采用了CoreData,但每当执行4到5分钟后会报异常造成崩溃.刚接触IOS开发,对多线程数据持久化理解不足,希望有经验的大牛指点一下有什么办法或者

iOS开发之表视图爱上CoreData

在接触到CoreData时,感觉就是苹果封装的一个ORM.CoreData负责在Model的实体和sqllite建立关联,数据模型的实体类就相当于Java中的JavaBean, 而CoreData的功能和JavaEE中的Hibernate的功能类似,最基本是两者都有通过对实体的操作来实现对数据库的CURD操作.CoreData中的上下文(managedObjectContext)就相当于Hibernate中的session对象, CoreData中的save操作就和Hibernate中的comm

iOS中CoreData数据管理系列二——CoreData框架中三个重要的类

iOS中CoreData数据管理系列二--CoreData框架中三个重要的类 一.引言     在上一篇博客中,介绍了iOS中使用CoreData框架设计数据模型的相关步骤.CoreData框架中通过相关的类将数据--数据模型--开发者无缝的衔接起来.NSManagedObjectModel对应数据模型,即上篇博客中我们创建的.xcdatamodeld文件:NSPersistentStoreCoordinator相当于数据库与数据模型之间的桥接器,通过NSPersistentStoreCoord

ios coredata数据操作-iOS coredata数据操作

问题描述 iOS coredata数据操作 各位大大求指导:用coredata做个新闻类的APP,每次从服务器上请求的数据和本地coredata里面的数据进行对比(有一个专门id来区别每条信息),如果有相同的id就不对本地数据进行更新,如果本地coredata的数据库里面没有从网上请求最新的id,删除本地数据,插入新id的数据. 最终结果就是本地数据库信息条数不会变化,求指导

iOS基础教程:在建好的项目中加入CoreData[转]

这几天在做一个ios的小项目,项目中需要对数据进行基本的增删改查操作.于是就想用一把CoreData.但在创建项目初期,没有包含进CoreData.于是就在已建好的项目中加入CoreData.由于第一次用CoreData,各方面还不是很熟悉,在网上爬文,找到了一篇关于这方面的文章(http://www.iteye.com/topic/1017633).于是,自己在这篇文章的基础上经过一天的研究,特把自己出错的地方进行简单的总结.并把步骤完善一下. 1.如果想在已建好的项目中加入CoreData,