美文网首页iOS 之路iOSiOS数据库操作
iOS CoreData数据库之增删改查

iOS CoreData数据库之增删改查

作者: tanyufeng | 来源:发表于2016-05-13 17:03 被阅读1855次

    本文的主要对象是对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];
        
    }
    
    

    欢迎大家踊跃评论,让我们一起探讨技术!!
    如果觉得文章不错,请帮忙点击文章下方的喜欢!!
    你的支持将是对我最好的鼓励, 谢谢!!!

    相关文章

      网友评论

      • Best_Kai:request.predicate = [NSPredicate predicateWithFormat:@"%@ = %@",key,value];
        request.predicate = [NSPredicate predicateWithFormat:@"userName = %@",@"my2015"]
        楼主知道这两个的区别吗?我用第二个可以请求到数据,但是第一个请求不到。
      • 苜蓿鬼仙:按照第二种方式创建的CoreData,也关联了 实体类,但是在插入数据的时候报错,Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Week'
        tanyufeng:@苜蓿鬼仙 你看看你的实体名称(+entityForName:实体名称)是否写对了,实体的名称是字符串的很容易写错
      • 对歌当酒:请问作者,增加单表的时候有没有遇到“'Student' must have a valid NSEntityDescription.'”问题?
        tanyufeng:@对歌当酒 学生实体必须是要通过向导生成的, 不能简简单单的创建一个学生类
      • 朱凯奇:不错,好久没用都快忘记了,来看看 好贴

      本文标题:iOS CoreData数据库之增删改查

      本文链接:https://www.haomeiwen.com/subject/ztkmrttx.html