说明:
CoreData是数据库框架,封装了原始的SQLite操作,直接操作对象就可以完成增删改查。
一、建立CoreData数据表与对应的数据对象:
1.在创建iOS工程时,在输工程名称与包名的窗口,选中"Use Core Data",如图所示:
2.在打开的工程目录中选中"工程名.xcdatamodeId",在中间视图窗口点底部"Add Entity",增加一个表,如图所示:
在中间视图上面的ENTITIES中会增加一个"Entity",如图所示:
3.在右侧属性面板中修改表名与映射的类名,如图所示:
4.在Attributes中增加表一些字段,如图所示:
5.选中"工程名.xcdatamodeId",点击菜单栏"Editor",在弹出菜单选中"Create NSManagedObject Subclass...",在弹出窗口中一直点"Next",直到创建完成,如图所示:
自动生成的类如图所示:
二、实现增删改查操作:
1.导入依赖包:
//导入CoreData包
#import <CoreData/CoreData.h>
//导入实体类
#import "UserInfo+CoreDataClass.h"
//导入NSPersistentContainer存入类
#import "AppDelegate.h"
2.初始化全局NSManagedObjectContext:
@property (nonatomic, strong) NSManagedObjectContext *dbContext;
/*
懒加载,初始化全局NSManagedObjectContext
*/
- (NSManagedObjectContext *)dbContext{
if(_dbContext == nil){
//1.获取AppDelegate
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
//2.获取NSManagedObjectContext
_dbContext = appDelegate.persistentContainer.viewContext;
}
return _dbContext;
}
3.插入数据:
/*
插入数据
*/
- (void)insert:(UserInfo *)newInfo{
// 1.根据表名获取关联对象
UserInfo *oldInfo = [NSEntityDescription insertNewObjectForEntityForName:@"UserInfo" inManagedObjectContext:self.dbContext];
//2.给关联对象赋值
oldInfo.name = newInfo.name;
oldInfo.age = newInfo.age;
oldInfo.job = newInfo.job;
//用于存储插入失败的错误信息
NSError *error = nil;
//3.插入数据
BOOL result = [self.dbContext save:&error];
if (result) {
NSLog(@"数据插入成功");
}else{
NSLog(@"数据插入失败,错误原因:%@", error);
}
}
2.更新数据:
/*
更新数据
*/
- (void)update:(UserInfo *)newInfo{
//1.设置查询条件
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"UserInfo"];
request.predicate = [NSPredicate predicateWithFormat:@"name=%@", newInfo.name];
//2.获取查询列表
NSArray *oldList = [self.dbContext executeFetchRequest:request error:nil];
//3.更新关联对象
for (UserInfo *oldInfo in oldList) {
oldInfo.age = newInfo.age;
oldInfo.job = newInfo.job;
}
//用于存储更新失败的错误信息
NSError *error = nil;
//4.更新数据
BOOL result = [self.dbContext save:&error];
if (result) {
NSLog(@"数据更新成功");
}else{
NSLog(@"数据更新失败,错误原因:%@", error);
}
}
3.查询数据:
(1)查询所有数据:
1.1查询:所有数据
*/
- (NSArray *)queryAll{
//1.设置查询条件
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"UserInfo"];
//2.设置排序
request = [self setSortDescriptor:request];
//用于存储查询失败的错误信息
NSError *error = nil;
//3.获取查询列表
NSArray *list = [self.dbContext executeFetchRequest:request error:&error];
if (!error) {
NSLog(@"数据查询成功");
return list;
}else{
NSLog(@"数据查询失败,错误原因:%@", error);
}
return nil;
}
(2)查询分页数据:
/*
1.1查询:分页数据
position:每页开始位置,从0开始
count:每页条数
*/
- (NSArray *)queryPage:(NSInteger)position count:(NSInteger)count{
//1.设置查询条件
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"UserInfo"];
//2.设置每页开始位置
request.fetchOffset = position;
//3.设置每页条数
request.fetchLimit = count;
//4.设置排序
request = [self setSortDescriptor:request];
//用于存储查询失败的错误信息
NSError *error = nil;
//5.获取查询列表
NSArray *list = [self.dbContext executeFetchRequest:request error:&error];
if (!error) {
NSLog(@"数据查询成功, 数据列表:%@", list);
return list;
}else{
NSLog(@"数据查询失败,错误原因:%@", error);
}
return nil;
}
(3)搜索数据:
/*
1.1查询:搜索数据
key:搜索字符串
*/
- (NSArray *)search:(NSString *)searchKey{
//1.设置查询条件
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"UserInfo"];
//创建模糊匹配条件,*为通配符
NSString *key = [NSString stringWithFormat:@"*%@*", searchKey];
request.predicate = [NSPredicate predicateWithFormat:@"name like %@", key];
//2.设置排序
request = [self setSortDescriptor:request];
//用于存储查询失败的错误信息
NSError *error = nil;
//3.获取查询列表
NSArray *list = [self.dbContext executeFetchRequest:request error:&error];
if (!error) {
NSLog(@"数据查询成功, 数据列表:%@", list);
return list;
}else{
NSLog(@"数据查询失败,错误原因:%@", error);
}
return nil;
}
(4)对查询的列表进行排序:
/*
1.2设置排序
*/
- (NSFetchRequest *)setSortDescriptor:(NSFetchRequest *)request{
//1.设置排序条件
NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"name"ascending:YES];
request.sortDescriptors = @[sd]; //多个排序条件:@[sd1, sd2, sd3]
return request;
}
4.删除数据:
/*
删除数据
*/
-(void)deleteInfo:(UserInfo *)info{
//1.设置查询条件
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"UserInfo"];
request.predicate = [NSPredicate predicateWithFormat:@"name=%@", info.name];
//2.获取查询列表
NSArray *list = [self.dbContext executeFetchRequest:request error:nil];
//3.删除数据
for (UserInfo *info in list) {
[self.dbContext deleteObject:info];
}
//用于存储删除失败的错误信息
NSError *error = nil;
//4.保存删除结果
BOOL result = [self.dbContext save:&error];
if (result) {
NSLog(@"数据删除成功");
}else{
NSLog(@"数据删除失败,错误原因:%@", error);
}
}
三、测试增删改查:
1.测试插入数据:
/*
测试插入数据
*/
- (void)testInsert{
UserInfo *info1 = [[UserInfo alloc] initWithContext:self.dbContext];
info1.name = @"姓名1";
info1.age = 26;
info1.job = @"中级工程师";
[self insert:info1];
UserInfo *info2 = [[UserInfo alloc] initWithContext:self.dbContext];
info2.name = @"姓名2";
info2.age = 28;
info2.job = @"高级级工程师";
[self insert:info2];
UserInfo *info3 = [[UserInfo alloc] initWithContext:self.dbContext];
info3.name = @"姓名3";
info3.age = 32;
info3.job = @"专家工程师";
[self insert:info3];
}
2.测试更新数据:
/*
测试更新数据
*/
- (void)testUpdate{
UserInfo *uObj = [[UserInfo alloc] initWithContext:self.dbContext];
uObj.name = @"姓名2";
uObj.job = @"资深工程师";
[self update:uObj];
}
3.测试查询数据:
/*
测试查询数据
*/
- (void)testQuery{
NSArray *list = [self queryAll];
// NSArray *list = [self queryPage:0 count:10];
// NSArray *list = [self search:@"姓名2"];
for (UserInfo *item in list) {
NSLog(@"name:%@", item.name);
}
}
4.测试删除数据:
/*
测试删除数据
*/
- (void)testDelete{
UserInfo *dObj = [[UserInfo alloc] initWithContext:self.dbContext];
dObj.name = @"姓名2";
[self deleteInfo:dObj];
}