本文的主要对象是对CoreData数据库及他的创建有一定了解的开发者,如果对CoreData还了解的可以看我上篇博客《iOS CoreData数据库之创建详解》;
增(保存数据)
单表增加
单表对象其实就是在我们的实体对象中只有基本的一些数据类型
,没有关联其他自定义类的属性
。
//单表的添加
-(void)addSigleEntity
{
//创建一个实体描述--表
NSEntityDescription *entity = [NSEntityDescription entityForName:@"LXStudent" inManagedObjectContext:self.context];
//根据实体描述,创建学生对象
Student *stu = [[Student alloc] initWithEntity:entity insertIntoManagedObjectContext:self.context];
stu.name = @"女神";
stu.age = @21;
stu.gender = @"女";
stu.score = @99.5;
//保存数据
NSError *error = nil;
[self.context save:&error];
//判断保存是否成功
if (error) {
NSLog(@"error = %@", error);
}
}
多表对象增加
多表对象就是一个实体类中拥有其他自定义类
定义的属性
//多表对象添加
-(void)addMutableEntity
{
//创建班级对象
//创建一个班级实体描述---表结构
NSEntityDescription *classEntity = [NSEntityDescription entityForName:@"MyClass" inManagedObjectContext:self.context];
//创建班级对象
MyClass *c1 = [[MyClass alloc] initWithEntity:classEntity insertIntoManagedObjectContext:self.context];
c1.class_name = @"实验班";
c1.class_id = @10;
//创建学生对象
//创建一个实体描述--表
NSEntityDescription *entity = [NSEntityDescription entityForName:@"LXStudent" inManagedObjectContext:self.context];
//根据实体描述,创建学生对象
Student *stu = [[Student alloc] initWithEntity:entity insertIntoManagedObjectContext:self.context];
stu.name = @"女神";
stu.age = @21;
stu.gender = @"女";
stu.score = @99.5;
//将另外一个对象当做当前对象的属性
stu.myClass = c1;
//保存数据
//保存
NSError *error = nil;
[self.context save:&error];
//判断
if (error) {
NSLog(@"error = %@", error);
}
}
通过上述两种方式的添加,大家会发现,其实利用CoreData对数据存储我们不需要关心存储的底层,我们只需要关心数据的处理。
查(获取数据)
普通的查找
-(void)readEntity
{
//创建查询请求--类似于网络请求NSURLRequest
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"LXStudent"];
//查询条件--可选
//就是需要LXStudent中gender的值必须为"男"
NSPredicate *name = [NSPredicate predicateWithFormat:@"gender = %@", @"男"];
request.predicate = name;
//对结果进行排序--可选
NSSortDescriptor *ageSort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
request.sortDescriptors = @[ageSort];
//发送查询请求,并返回结果
NSError *error = nil;
NSArray *resArray = [self.context executeFetchRequest:request error:&error];
//对查询结果进行判断并处理
if (error) {
NSLog(@"error = %@", error);
}
else
{
//存在resArray中的是装换后的对象
for (Student *stu in resArray) {
NSLog(@"name = %@, age = %@, gender = %@", stu.name, stu.age, stu.gender);
}
}
}
模糊查询
-(void)readEntity
{
//创建查询请求--类似于网络请求NSURLRequest
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"LXStudent"];
//查询条件--可选
// 模糊查询
// 名字以"wang"开头
// NSPredicate *pre = [NSPredicate predicateWithFormat:@"name BEGINSWITH %@",@"wangwu1"];
// request.predicate = pre;
// 名字以"1"结尾
// NSPredicate *pre = [NSPredicate predicateWithFormat:@"name ENDSWITH %@",@"1"];
// request.predicate = pre;
// 名字包含"wu1"
// NSPredicate *pre = [NSPredicate predicateWithFormat:@"name CONTAINS %@",@"wu1"];
// request.predicate = pre;
// like
//以wangwu1*开头
NSPredicate *pre = [NSPredicate predicateWithFormat:@"name like %@",@"*wu12"];
request.predicate = pre;
//发送查询请求,并返回结果
NSError *error = nil;
NSArray *resArray = [self.context executeFetchRequest:request error:&error];
//对查询结果进行判断并处理
if (error) {
NSLog(@"error = %@", error);
}
else
{
//存在resArray中的是装换后的对象
for (Student *stu in resArray) {
NSLog(@"name = %@, age = %@, gender = %@", stu.name, stu.age, stu.gender);
}
}
}
分页查询
分页查询在很多场合都会使用
-(void)pageSeacher{
//创建查询请求--类似于网络请求NSURLRequest
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"LXStudent"];
// 3.设置排序
// 身高的升序排序
NSSortDescriptor *scoreSort = [NSSortDescriptor sortDescriptorWithKey:@"score" ascending:NO];
request.sortDescriptors = @[scoreSort];
// 总有共有15数据
// 每次获取6条数据
// 第一页 0,6
// 第二页 6,6
// 第三页 12,6 3条数据
// 分页查询 limit 0,5
// 从第几页开始显示
// 通过这个属性实现分页
request.fetchOffset = 12;
// 每页显示多少条数据
request.fetchLimit = 6;
//发送查询请求,并返回结果
NSError *error = nil;
NSArray *resArray = [self.context executeFetchRequest:request error:&error];
//对查询结果进行判断并处理
if (error) {
NSLog(@"error = %@", error);
}
else
{
//存在resArray中的是装换后的对象
for (Student *stu in resArray) {
NSLog(@"name = %@, age = %@, gender = %@", stu.name, stu.age, stu.gender);
}
}
}
改(修改数据)
修改已经保存到数据库中的数据,在修改之前我们应该获取要修改的数据,修改之后对数据进行再次保存
-(void)updateEntity
{
//创建查询请求
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"LXStudent"];
//查询我们可以添加查询条件,这里就不举例
//没有任何条件就是将所有的数据都查询出来
//发送请求
NSError *error = nil;
NSArray *resArray = [self.context executeFetchRequest:request error:&error];
//修改
for (Student *stu in resArray) {
stu.age = @30;
}
//保存
[self.context save:nil];
}
删(删除数据)
-(void)deleteEntity
{
//创建查询请求
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"LXStudent"];
//查询条件
NSPredicate *pre = [NSPredicate predicateWithFormat:@"score < %d", 60];
request.predicate = pre;
//发送请求
NSError *error = nil;
NSArray *resArray = [self.context executeFetchRequest:request error:&error];
//删除
for (Student *stu in resArray) {
[self.context deleteObject:stu];
}
//保存--记住保存
[self.context save:nil];
}
欢迎大家踊跃评论,让我们一起探讨技术!!
如果觉得文章不错,请帮忙点击文章下方的喜欢
!!
你的支持将是对我最好的鼓励, 谢谢!!!
网友评论
request.predicate = [NSPredicate predicateWithFormat:@"userName = %@",@"my2015"]
楼主知道这两个的区别吗?我用第二个可以请求到数据,但是第一个请求不到。