iOS:CoreData数据库的使用二(创建多个数据库表,表之间有对应关系)

简介:

  CoreData数据库框架是一个封装性好,功能强大数据库,它底层使用的还是sqlite数据库,不过苹果公司在其基础上,为其封装新和安全性的维护上做了大量的处理,例如对一些事物做了详细的操作,如读脏数据、提交回滚等,使得CoreData的安全性很可靠。

  用数据库存储数据时,有时候不只是创建一个表,在创建多个表格并且两者之间有对应关系时,使用CoreData数据库框架能够很轻松的解决这些问题,效率极高。光说还是不能当真,下面我就来使用这个数据库存储两个有各自的属性数据并且有对应关系的表吧。

 

要求:创建两个表,一个是图书馆表,它的属性有:用户custommer、开放时间date;另一个是读者,它的属性有:姓名name、学号sno、年龄age、性别gender;

图书馆对应读者的关系时:一对多(一个图书馆里可以同时有多个用户)   

读者对应图书馆是:一对一 (一个用户只能同时在一个图书馆中读书,没有分身术哟)

 

详细的实现步骤:

1、创建项目时,勾选Use CoreData选项;

2、创建项目成功后,所生成的文件中有CoreData___.xcdatamodel文件,点击它进入项目设置面板中;

 

3、在该面板中的左下方选择Add Entity选项,创建连个实体对象,并将其类名分别写成Library和Reader;

       

4、为类Library添加属性Attributes为:用户custommer string类型、开放时间date Date类型

5、为类Reader添加属性Attributes为:姓名name string类型、学号sno  string类型、年龄age integer32类型、性别gender integer16类型;

6、为这两个实体创建对应关系,在relationship下点击'+'号,设置联系标识即可;

读者对应图书馆:一对一的关系

          

图书馆对应读者:一对多的关系 

       

 

7、分别为这两个实体创建对应的类,它们都要继承于NSManagedObject,方法是:随意选中一个实体,然后点击模拟器菜单栏中的Editor下的Create NSManagedObject subclass...,编译器就帮助建立了这两个实体类Library.h/.m、Reader.h/.m,并且帮助声明和定义了所有的属性;

             

8、点击面板中的右下角的style按钮,可以查看两个表之间的联系和所有数据;

          

9、前期的操作已经全部完成,最后就是代码实现对数据库的操作功能了。

  9.1在AppDelegate.m文件的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中设置表中的数据信息并将数据保存到存储持久层:

复制代码
 1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 2     
 3     NSUserDefaults *defaluts = [NSUserDefaults standardUserDefaults];
 4     self.isInserted = [defaluts boolForKey:@"isInserted"];
 5     
 6     //防止重复插入
 7     if(!self.isInserted)
 8     {
 9 
10         //取出图书馆实体对象
11         Library *library = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([Library class]) inManagedObjectContext:self.managedObjectContext];
12         
13         //设置对象属性
14         library.custommer = @"HIST";
15         library.date = [NSDate date];
16         
17         
18         for(int i=0; i<5; i++)
19         {
20             //取出读者实体对象
21             Reader *reader = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([Reader class]) inManagedObjectContext:self.managedObjectContext];
22             
23             //设置对象属性
24             reader.name = [NSString stringWithFormat:@"name-%02d",i+1];
25             reader.sno = [NSString stringWithFormat:@"1000%d",i];
26             reader.age = @(20 + i);
27             reader.gender = @'M';
28             
29             //添加对应关系(图书馆对应多个读者)
30             [library addReadRelateObject:reader];
31         }
32         
33         //保存数据到持久层
34         [self saveContext];
35         
36         
37         //设置偏好设置,并强制写入文件中
38         [defaluts setBool:YES forKey:@"isInserted"];
39         [defaluts synchronize];
40     }
41     
42     return YES;
43 }
复制代码

  9.2 在视图控制器类ViewController.m文件中的- (void)viewDidLoad方法中可以对数据库中的数据执行增删改查的操作:

复制代码
 1 - (void)viewDidLoad {
 2     [super viewDidLoad];
 3     
 4     //创建应用程序对象
 5     AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];
 6     
 7     //从CoreData中取出数据
 8     
 9     
10     //为查询图书馆信息创建请求对象
11     NSFetchRequest *fetchLibraryRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([Library class])];
12     
13     //为查询读者信息创建请求对象
14     NSFetchRequest *fetchReadRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([Reader class])];
15     
16     //设置查询条件(可选的,类似于sql语句中的where语句)
17     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"sno >= %d",10000];
18     [fetchReadRequest setPredicate:predicate];
19     
20     //执行查询操作(返回的是一个数据数组)
21     NSError *error;
22     
23     NSArray *librarys = [appDelegate.managedObjectContext executeFetchRequest:fetchLibraryRequest error:&error];
24     
25     NSArray *readers = [appDelegate.managedObjectContext executeFetchRequest:fetchReadRequest error:&error];
26     
27     
28     //遍历图书馆信息
29     [librarys enumerateObjectsUsingBlock:^(Library *library, NSUInteger idx, BOOL *stop) {
30         NSLog(@"custommer:%@,date:%@",library.custommer,library.date);
31         
32         //遍历读者信息
33         [readers enumerateObjectsUsingBlock:^(Reader *reader, NSUInteger idx, BOOL *stop) {
34             NSLog(@"name:%@,sno:%@,age:%@,gender:%c",reader.name,reader.sno,reader.age,(char)[reader.gender integerValue]);
35             
36             //修改读者信息
37             if([reader.name isEqualToString:@"name-02"])
38             {
39                 reader.sno = @"111111";
40             }
41             //保存数据修改
42             NSError *error;
43             [appDelegate.managedObjectContext save:&error];
44             if(error)
45             {
46                 NSLog(@"修改失败");
47             }
48         }];
49     }];
50 }
复制代码

 

演示结果如下:

这个是没有修改之前查询的:

复制代码
2015-09-22 16:43:42.720 CoreData数据库2[3069:157899] custommer:HIST,date:2015-09-22 08:18:14 +0000
2015-09-22 16:43:42.721 CoreData数据库2[3069:157899] name:name-02,sno:10001,age:21,gender:M
2015-09-22 16:43:42.722 CoreData数据库2[3069:157899] name:name-01,sno:10000,age:20,gender:M
2015-09-22 16:43:42.722 CoreData数据库2[3069:157899] name:name-03,sno:10002,age:22,gender:M
2015-09-22 16:43:42.722 CoreData数据库2[3069:157899] name:name-05,sno:10004,age:24,gender:M
2015-09-22 16:43:42.722 CoreData数据库2[3069:157899] name:name-04,sno:10003,age:23,gender:M
复制代码

 

这个是修改数据之后查询的:

复制代码
2015-09-22 17:53:58.952 CoreData数据库2[3507:191823] custommer:HIST,date:2015-09-22 08:18:14 +0000
2015-09-22 17:53:58.953 CoreData数据库2[3507:191823] name:name-02,sno:111111,age:21,gender:M
2015-09-22 17:53:58.954 CoreData数据库2[3507:191823] name:name-01,sno:10000,age:20,gender:M
2015-09-22 17:53:58.955 CoreData数据库2[3507:191823] name:name-03,sno:10002,age:22,gender:M
2015-09-22 17:53:58.955 CoreData数据库2[3507:191823] name:name-05,sno:10004,age:24,gender:M
2015-09-22 17:53:58.955 CoreData数据库2[3507:191823] name:name-04,sno:10003,age:23,gender:M
复制代码

 

程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!


本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4829718.html,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
160 1
|
2月前
|
SQL 数据库 数据库管理
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(一)模式、表、索引与视图
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(一)模式、表、索引与视图
100 11
|
2月前
|
SQL 安全 数据库
SQLServer 实现数据库表复制到另一个数据库_kaic
SQLServer 实现数据库表复制到另一个数据库_kaic
|
10天前
|
SQL 监控 关系型数据库
实时计算 Flink版操作报错合集之在设置监控PostgreSQL数据库时,将wal_level设置为logical,出现一些表更新和删除操作报错,怎么办
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
10天前
|
SQL Java 持续交付
实时计算 Flink版产品使用问题之源数据库一直在新增表或修改表结构,需要进行相应的修改和重启,该如何简化
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
1月前
|
SQL 存储 数据库
SQL 撤销索引、撤销表以及撤销数据库
SQL 撤销索引、撤销表以及撤销数据库
29 4
|
1月前
|
SQL 存储 数据管理
数据管理DMS产品使用合集之如何把整个数据库的表和数据全部导出来
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
|
2月前
|
SQL 数据库 索引
数据库中表维护
【5月更文挑战第7天】本文介绍了提高数据库性能的五个技巧。1) 使用`ON DUPLICATE KEY UPDATE`或`ON CONFLICT DO UPDATE`避免锁竞争,尤其在高并发更新计数器场景下。2) 通过JOIN查询进行基于选择的更新。3) 使用公式表达式-CTE-删除重复行 。4) 定期运行`ANALYZE`命令更新表统计信息。这些方法有助于优化数据库性能,减少锁等待和提高查询速度。
56 1
数据库中表维护
|
1月前
|
SQL Apache 数据库
doris数据库的表重命名语法是什么
【6月更文挑战第24天】doris数据库的表重命名语法是什么
184 0
|
1月前
|
存储 数据库连接 数据库
逆向学习数据库篇:表设计和数据库操作的核心概念与流程
逆向学习数据库篇:表设计和数据库操作的核心概念与流程
18 0