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

简介:

CoreData数据库是用来持久性存储数据的,那么,我们再从该数据库中取出数据干什么呢?明显的是为了对数据做操作,这个过程中可以将它们直观的显示出来,即通过表格的形式显示出来。CoreData配合tableView一起使用,是很常用的一种方式,直观、清晰明了。

下面就来具体的举个例子:

要求:将数据库中的数据显示在表格中,并且可以进行删除、插入等一些操作。

 

前期的具体步骤:

1、创建项目时,勾选Use Core Data,生成CoreData_____.xcdatamodel文件;

2、点击CoreData_____.xcdatamodel文件,进入项目面板,点击左下角的Add Entity创建实体对象;

    

3、在Attributes处点击'+'号,添加实体对象的属性

4、选中实体对象,点击模拟器菜单栏上的Editor下的create NSManagedObjectSubclass..,自动创建该实体对象的类

        

5、点击项目面板右下角的style查看所创建的表

6、在故事板Storyboard中拖入一个表格UITableView,并将tableView和控制类进行IBOutlet关联

好了,在AppDelegate和Student类编译器自动帮助声明和定义了需要的方法和属性,前期的工作已经完成,最后就是代码来操作数据库了:

在AppDelegate类中准备测试数据并将它们存储到数据库中:

复制代码
 1 #import "AppDelegate.h"
 2 #import "Student.h"
 3 
 4 @interface AppDelegate ()
 5 @property (assign,nonatomic)BOOL isInserted;
 6 @end
 7 
 8 @implementation AppDelegate
 9 
10 //准备测试数据
11 -(void)addStudentWithName:(NSString *)name andAge:(NSNumber*)age andGender:(NSNumber*)gender
12 {
13     //取数据库中实体对象
14     Student *student = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([Student class]) inManagedObjectContext:self.managedObjectContext];
15     
16     student.name = name;
17     student.age = age;
18     student.gender = gender;
19 }
20 
21 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
22     
23     //在偏好设置中设置标识符,用来防止数据被重复插入
24     NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
25     self.isInserted = [userDefaults boolForKey:@"isInserted"];
26     
27     //设置实体对象的属性
28     if(!self.isInserted)
29     {
30         [self addStudentWithName:@"张三" andAge:@20 andGender:@'M'];
31         [self addStudentWithName:@"李四" andAge:@21 andGender:@'F'];
32         [self addStudentWithName:@"王五" andAge:@20 andGender:@'M'];
33         [self addStudentWithName:@"赵六" andAge:@23 andGender:@'F'];
34         [self addStudentWithName:@"陈七" andAge:@24 andGender:@'F'];
35         [self addStudentWithName:@"郑八" andAge:@25 andGender:@'M'];
36         [self addStudentWithName:@"戴九" andAge:@19 andGender:@'M'];
37         [self addStudentWithName:@"刘十" andAge:@22 andGender:@'F'];
38     }
39     
40     //设置偏好设置,并强制写到文件中
41     [userDefaults setBool:YES forKey:@"isInserted"];
42     [userDefaults synchronize];
43     
44     //保存数据到持久层
45     [self saveContext];
46     
47     return YES;
48 }
复制代码

在控制器类ViewController中取出数据库中的数据,并将它们显示在表格中,然后进行删除和插入操作:

复制代码
  1 #import "ViewController.h"
  2 #import "AppDelegate.h"
  3 #import "Student.h"
  4 
  5 @interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
  6 @property (weak, nonatomic) IBOutlet UITableView *tableView;
  7 @property (strong,nonatomic)NSMutableArray *stus;
  8 @end
  9 
 10 @implementation ViewController
 11 
 12 - (void)viewDidLoad {
 13     [super viewDidLoad];
 14     //设置应用程序代理
 15     AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];
 16     
 17     //设置数据源和代理
 18     self.tableView.dataSource = self;
 19     self.tableView.delegate = self;
 20     
 21     //从CoreData数据库中取出实体对象信息
 22     
 23     //创建请求对象
 24     NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([Student class])];
 25     
 26     //批处理
 27     fetchRequest.fetchBatchSize = 10;
 28     
 29     //创建排序对象
 30     NSSortDescriptor *ageSort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
 31     [fetchRequest setSortDescriptors:@[ageSort]];
 32     
 33     //上下文发送查询请求
 34     NSError *error = nil;
 35     NSArray *array = [appDelegate.managedObjectContext executeFetchRequest:fetchRequest error:&error];
 36     if(error)
 37     {
 38         return; //获取数据失败
 39     }
 40     
 41     self.stus = [NSMutableArray arrayWithArray:array];
 42     
 43 }
 44 
 45 //设置行
 46 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 47 {
 48     return self.stus.count;
 49 }
 50 //设置每一个单元格的内容
 51 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 52 {
 53     //1.根据reuseIdentifier,先到对象池中去找重用的单元格对象
 54     static NSString *reuseIdentifier = @"stuCell";
 55     UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
 56     //2.如果没有找到,自己创建单元格对象
 57     if(cell == nil)
 58     {
 59         cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIdentifier];
 60     }
 61     //3.设置单元格对象的内容
 62     Student *student = [self.stus objectAtIndex:indexPath.row];
 63     cell.textLabel.text = student.name;
 64     cell.detailTextLabel.text = [NSString stringWithFormat:@"%@  %c",student.age,(char)[student.gender integerValue]];
 65     return cell;
 66 }
 67 
 68 //编辑单元格
 69 -(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
 70 {
 71     return YES;
 72 }
 73 
 74 //编辑类型
 75 -(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
 76 {
 77     //删除
 78     return UITableViewCellEditingStyleDelete;
 79 }
 80 
 81 //对编辑类型的处理
 82 -(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
 83 {
 84     
 85     AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];
 86     
 87     //删除CoreData数据库中数据
 88     Student *student = [self.stus objectAtIndex:indexPath.row];
 89     [appDelegate.managedObjectContext deleteObject:student];
 90     NSError *error = nil;
 91     [appDelegate.managedObjectContext save:&error];
 92     if(error)
 93     {
 94           NSLog(@"删除失败");
 95     }
 96     
 97     //删除数据源数据
 98     [self.stus removeObjectAtIndex:indexPath.row];
 99 
100     
101     //删除一条记录的同时,往CoreData数据库插入两条数据
102     [appDelegate addStudentWithName:@"小明" andAge:@24 andGender:@'M'];
103     [appDelegate addStudentWithName:@"小李" andAge:@25 andGender:@'M'];
104     
105     [appDelegate.managedObjectContext save:&error];
106     if(error)
107     {
108         NSLog(@"删除失败");
109     }
110

        //局部刷新表格

          //[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];

111     
112     //整体刷新表格
113     [self.tableView reloadData];
114 }
115 
116 @end
复制代码

 演示结果如下:

从数据库取出数据显示在表格上                         在单元格上从左向右滑动删除数据

          

删除几个数据后显示结果                 删除一次时,(重新取数据仅仅删除了郑八时)同时插入两个指定的数据后结果

          

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


本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4830623.html,如需转载请自行联系原作者
目录
相关文章
|
7月前
|
Java 数据库
SpringBoot定时将数据库表生成Excel表格
SpringBoot定时将数据库表生成Excel表格
101 0
|
2月前
|
数据采集 人工智能 自然语言处理
表格增强生成TAG登场:解锁AI自然语言与数据库的完美结合
【10月更文挑战第4天】表格增强生成(TAG)范式解锁了AI自然语言处理与数据库的深度融合,旨在让用户通过自然语言便捷地查询和管理数据。TAG结合了语言模型的强大推理能力和数据库系统的高效计算能力,通过查询合成、执行及答案生成三步完成复杂查询。相较于传统Text2SQL和RAG方法,TAG在准确性上显著提升,但其应用仍面临技术门槛和数据质量等挑战。[论文地址:](https://arxiv.org/pdf/2408.14717)
61 4
|
7月前
|
存储 NoSQL MongoDB
MongoDB数据库转换为表格文件的Python实现
MongoDB数据库转换为表格文件的Python实现
221 0
|
5月前
|
关系型数据库 MySQL 数据库
使用Python读取xlsx表格数据并导入到MySQL数据库中时遇到的问题24
【7月更文挑战第24天】使用Python读取xlsx表格数据并导入到MySQL数据库中
65 7
|
4月前
|
SQL 前端开发 Java
已知数据库中存在表tb_book2,通过在图书信息界面填写书本的基本信息,然后提交后写入数据库中的表格中。需要对提交的信息进行修改,信息填入不能为空,为空则则有提示。
该博客文章通过示例演示了如何使用JSP结合SQL Server数据库向表`tb_book2`中添加图书信息,包括信息填写、前端验证、JavaBean封装图书属性、使用`PreparedStatement`执行插入操作,并确保了提交的信息不能为空,否则会给出提示。
|
6月前
|
存储 关系型数据库 数据库
回顾数据库的三级模式,为什么比直接存文件表格好?
【6月更文挑战第10天】本文介绍数据库用于解决Excel等文件系统存在的数据冗余、不一致和访问困难等问题。DBMS中的关系有一对一、一对多、多对一和多对多四种类型。键有候选键、超级键、主键、备用键和外键等类型,功能依赖分为平凡和非平凡两种。
44 0
回顾数据库的三级模式,为什么比直接存文件表格好?
|
6月前
|
SQL 关系型数据库 MySQL
MYSQL————DDL方法使用(包含在数据库,以及具体数据库表格的一些操纵)
MYSQL————DDL方法使用(包含在数据库,以及具体数据库表格的一些操纵)
|
6月前
|
SQL 存储 数据可视化
excel表格sql数据库
Excel表格和SQL数据库是两种不同的数据管理工具,它们各自有自己的特点和用途。下面我将分别介绍它们,并探讨它们之间的关系和互操作性。 一、Excel表格 Excel是微软公司推出的一款
|
6月前
|
关系型数据库 MySQL 数据库
mysql数据库表格的增删改查
mysql数据库表格的增删改查
|
6月前
|
关系型数据库 MySQL 数据库
mysql数据库 , 表格的创建
mysql数据库 , 表格的创建