您的位置:首页 > 其它

【CoreData】表之间的关联

2015-11-02 20:59 218 查看
这次是表之间怎么进行关联,要求如下:
// 建立学生与班级表之间的联系
既然是表与表之间的关联,那肯定是要先创建表:

// 1.创建模型文件 (相当于一个数据库里的表)

// New File ———— CoreData ———— Data Model ———— Next





// 2.添加实体 (相当于一张表)

// 找到我们创建的模型文件(xxx.xcdatamodeld,我创建的叫School.xcdatamodeld)————Add
Entity ———— 添加表内属性(这边我添加2个属性(name,age))







//3.在此模型文件内我们再添加第二张表Classes,表内的属性(这边我添加一个属性(classname,classNo))









// 4.因为学生肯定是属于某个班级的,所以我们选择学生的表,在表中的Relationships内添加关联。







// 5.添加完关联后我们就需要创建实体了,在创建的过程中,我们会看到school内有2张表(student,classes),因为classes是没有关联任何表的(student则关联\依赖classes表),所以先创建classes实体,再创建student的实体。

// New File ———— CorData ———— NSManagedobject subclass ————Next(记得选择需要关联的表)这样就会自动生成相应的模型

// 5.1先关联classes表







// 5.2再关联student表







// 5.3生成以下相应模型



// 6.生成上下文 关联模型文件生成数据库(关联的时候,如果本地没有数据库文件,CoreData会自己创建)

// 上下文,记得引用CoreData框架

    NSManagedObjectContext *context= [[NSManagedObjectContext alloc]init];

// 上下文关联数据库

// model模型文件, 参数:mergedModelFromBundles:因为模型文件是资源文件,所以会放到BUNDLES里面,所以只需要写nil就可以了。

    NSManagedObjectModel *model= [NSManagedObjectModel mergedModelFromBundles:nil];

// 持久化存储调度器(持久化:把数据保存在一个文件,而不是放在内存中)

    NSPersistentStoreCoordinator *store=[[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

// 告诉CoreData数据库的名字和路径

    NSString *doc=
[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

    

    NSString *sqlitePath=[doc stringByAppendingPathComponent:@"School.sqlite"];

    [store addPersistentStoreWithType:NSSQLiteStoreTypeconfiguration:nil URL:[NSURL fileURLWithPath:sqlitePath] options:nilerror:nil];

    

    context.persistentStoreCoordinator =store;

然后我们来测试一下

#pragma mark - 添加
- (void)addStudent
{

  
// 创建两个班级一班,二班

   Classes*oneClass= [NSEntityDescriptioninsertNewObjectForEntityForName:@"Classes"inManagedObjectContext:_context];
    oneClass.classname=
@"一班";
    oneClass.classNo=
@(1.0);

    

   Classes*twoClass= [NSEntityDescriptioninsertNewObjectForEntityForName:@"Classes"inManagedObjectContext:_context];
    twoClass.classname=
@"二班";
    twoClass.classNo=
@(2.0);

    

  
// 创建两个学生对象

   Student*zhangsan= [NSEntityDescriptioninsertNewObjectForEntityForName:@"Student"inManagedObjectContext:_context];
    zhangsan.name=
@"张三";
    zhangsan.age=
@(1.80);
    zhangsan.classNo= oneClass;

    

   Student*lisi= [NSEntityDescriptioninsertNewObjectForEntityForName:@"Student"inManagedObjectContext:_context];
    lisi.name=
@"李四";
    lisi.age=
@(2.10);
    lisi.classNo= twoClass;

    

   //
直接保存数据库
    [_contextsave:nil];

    
}

#pragma mark - 读取
- (void)readStudent
{

  
// 只读取二班的学生

    

   // 1.FectchRequest
抓取请求对象

   NSFetchRequest
*request= [NSFetchRequest fetchRequestWithEntityName:@"Student"];

    

   // 2.设置过滤条件

  
//这边直接使用点语法就可以了

   NSPredicate*pre= [NSPredicatepredicateWithFormat:@"classNo.classname=
%@",@"二班"];
    request.predicate= pre;

    

   // 4.执行请求
   NSArray*stus = [_contextexecuteFetchRequest:requesterror:nil];

    
   for(Student*stu
instus)
    {
      NSLog(@"名字:%@班级:%@",stu.name,stu.classNo.classname);
    }

    
}

2015-10-29 22:09:06.519 CoreData表之间的关联[1817:76617]名字:李四班级:二班
2015-10-29 22:09:06.519 CoreData表之间的关联[1817:76617]名字:李四班级:二班

 
2015-10-29 22:09:06.519 CoreData表之间的关联[1817:76617]名字:李四班级:二班

好了,以上就是CoreData表之间的关联,分页等操作。会陆续更新!


DEMO下载地址:链接: http://pan.baidu.com/s/1qWtJgw0 密码: wpaa

如果哪里有错或者有什么问题可以随时联系我,转载请注明出处,谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: