使用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;
}

附录:

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

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

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

使用CoreData [2]

时间: 2024-10-11 03:36:48

使用CoreData [2]的相关文章

coredata 的基本使用(转载)

CoreData提供了一种简便的对象持久化管理方法,使你可以不用关心数据的存储,只需要关心对象的增加.删除.更改.读写. 基本概念托管对象(managed object)一个托管对象代表你想要保存到数据存储中的一个对象.这在概念上类似于SQL中的一条记录, 并且通常也包含一些域,这些域对应于你想要保存的对象的属性. 数据存储(data store)Core Data支持4中类型的数据存储:SQLiteStore, XMLStore, BinaryStore, InMemoryStore. 托管对

Playground 你不知道的小技巧, CoreData 的使用

Playground 的出现无疑是大大的提高了开发效率,可以节省大量的编译时间. 这里介绍在 Playground 中使用 CoreData 的小技巧. 我们新建一个工程 iOS 项目工程. 点击 File -> New -> File , 在工程中新建文件 Data Model 文件  在 model 中添加一个 Entitle,如下图  编译工程后,在 Product 选择生成的 .app 文件,找到该目录,如下图  查看包中的文件,如图  可以看到一个 Mode.momd 文件, 如图 

IOS中CoreData浅析

CoreData简介: 什么是CoreData? Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象.在此数据操作期间,我们不需要编写任何SQL语句 CoreData 不能执行SQL语句 取而代之,操作的是对象.而常用的三方库 FMDB SQLite 可以直接SQL语句 CoreData和数据库有什么区别? CoreData是一个苹果原生的框架,它拥有像数

CoreData数据库

CoreData与Sqlite的比较 Sqlite:1.基于C接口,需要使用sql语句,代码繁琐 2.在处理大量数据时,表关系更直观 3.在OC中不是可视化的 CoreData:1.可视化,有undo/redo能力 2.可以实现多种文件格式NSSQLiteStoreType.NSBinaryStoreType.NSInMemoryStoreType,NSXMLStoreType 3.苹果官方API支持,与iOS结合更紧密 CoreData核心类关系: NSManagedObjectContext

CoreData __ 基本原理

操作过程 Context想要获取值,先要告诉连接器,我要什么东西 链接器再告诉store, 你给我什么东西, store去找 找到之后返回给链接器,链接器再返回给Context          CoreData和sqlite的区别 CoreData是一个框架;sqlite是苹果使用别人开发好的一个动态库,本质是关系型数据库. CoreData是IOS平台下的一个数据持久化的方式;sqlite可以跨平台使用. 实现思路 首先找到CoreData文件夹 创建Person类,并且建立name属性 C

CoreData

CoreData 是什么? Core Data 是一个模型层的技术.Core Data 帮助你建立代表程序状态的模型层.Core Data 也是一种持久化技术,它能将模型对象的状态持久化到磁盘,但它最重要的特点是:Core Data 不仅是一个加载.保存数据的框架,它还能和内存中的数据很好的共事 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象.在此数据

coredata xmpp

CoreData数据库   好处: 1.表可视化  2.使用简单 3.可以与谓词搭配使用     缺点: 1.不适合处理数据结构   比较复杂的数据 数据结构和算法 NSURLSession Editor ->  Add Model Version  在CoreData添加新模型版本 XMPP                cacoapods 与git  之前都是短链接 http     websevice soap  推送, 要经过 服务器—>  Apns   -> app  长链接:

iOS:CoreData数据库的使用四(数据库和UITableViewController以及NSFetchedResultsController一起使用)

CoreData数据库虽然可以和tableview或者UITableViewController一起使用将数据显示在表格上,但是在准备数据的时候,这种方式需要用一个可变数组来装从数据库一次性取出来的所有数据,然后通过操作这个数组来显示数据再表格上,从内存的优化和性能上来说并不是很好:这里,介绍一种新的抓取数据的方式,苹果公司为了进一步优化内存,创建了一个从数据库抓取数据的控制器NSFetchedResultsController,它能从CoreData中一批一批的抓取数据并存放起来,然后通过操作

iOS:CoreData数据库的使用三(数据库和tableView表格一起使用)

CoreData数据库是用来持久性存储数据的,那么,我们再从该数据库中取出数据干什么呢?明显的是为了对数据做操作,这个过程中可以将它们直观的显示出来,即通过表格的形式显示出来.CoreData配合tableView一起使用,是很常用的一种方式,直观.清晰明了. 下面就来具体的举个例子: 要求:将数据库中的数据显示在表格中,并且可以进行删除.插入等一些操作. 前期的具体步骤: 1.创建项目时,勾选Use Core Data,生成CoreData_____.xcdatamodel文件: 2.点击Co

iOS开发——数据持久化OC篇&(七)CoreData高级常识

CoreData高级常识 关于CoreData貌似实际开发中很少用到,基本上是个有九个公司不会使用它,因为都说是性能不好,但是作为一个程序员,了解及其使用时必须了, 下面是我从一位大神那里搬过来的一下Core详细介绍,相信以后总有一天会帮我解决不少学习CoreData中的问题! 一.技术概览 1. Core Data 功能初窥 对于处理诸如对象生命周期管理.对象图管理等日常任务,Core Data框架提供了广泛且自动化的解决方案.它有以下特性. (注:对象图-Object graph的解释:在面