CoreData-增删改查(二)

接上篇文章,CoreData可视化创建和初始化(一)
可以自己创建一个tableView进行数据展示,并进行增删改查操作

1.需要先获取context 对象
AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    NSManagedObjectContext *context = delegate.context;
2.插入数据
// 增加数据
- (void)insertData{
    
    //    数据添加
    NSArray *arr = @[@{@"name":@"张三",@"age":@22,@"stuId":@6},@{@"name":@"李四",@"age":@22,@"stuId":@12},@{@"name":@"王二",@"age":@22,@"stuId":@11}];
    for (NSDictionary *dict in arr) {
        
        Model *model = [[Model alloc] initWithDictionary:dict];
        Student *student = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:self.context];
        student.name = model.name;
        student.stuId = model.stuId;
        student.age = model.age;
        NSError *error;
        [self.context save:&error];
        if (error) {
            NSLog(@"插入数据错误 %@",error);
        }
        
    }
    
}
3.查询数据
//  查询数据
- (void)fetchData{
//    查询指令
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
//    获取要查询的表单
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:self.context];
//    给查询指令设置要查询的表单
    [fetchRequest setEntity:entity];
//    自定义要查询的条件
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"stuId > %d",3];
//    给查询指令设置查询条件
    [fetchRequest setPredicate:predicate];
//  给查询进行排序  升序
    NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"stuId" ascending:YES];
//    年龄 升序
    NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
//    按照在数组的位置,越靠前优先级越高
    NSArray *sortDescriptors = @[sortDescriptor1,sortDescriptor2];
//    给查询指令设置排序条件
    fetchRequest.sortDescriptors = sortDescriptors;
    NSError *error;
//    可以随意转化成模型
     NSArray *result = [self.context executeFetchRequest:fetchRequest error:&error];
    if (error) {
        NSLog(@"查询失败 %@",error);
    }else{
        
        NSMutableArray *arrM = [NSMutableArray array];
//        for (NSInteger i = 0; i<result.count; i++) {
////            Student *student = result[i];
//            Model *model = result[i];
//            NSLog(@"%ld %@ %ld",(NSInteger)model.stuId,model.name,(NSInteger)model.age);
////            NSLog(@"%ld %@ %ld",(NSInteger)result[i].stuId,result[i].name,(NSInteger)result[i].age);
//
//        }
//        _modelList = arrM.copy;
        
        for (Model *model in result) {
             NSLog(@"%ld %@ %ld",(NSInteger)model.stuId,model.name,(NSInteger)model.age);
            [arrM addObject:model];
        }
         _modelList = arrM.copy;
        [self.tableView reloadData];
    }
    
}

查询时需要主要谓词的用法

谓词查询条件:predicate
谓词的条件指令
1.比较运算符 > 、< 、== 、>= 、<= 、!= 例:@"number >= 99"
2.范围运算符:IN 、BETWEEN 例:@"number BETWEEN {1,5}" @"address IN {'shanghai','nanjing'}"
3.字符串本身:SELF 例:@"SELF == 'APPLE'"
4.字符串相关:BEGINSWITH、ENDSWITH、CONTAINS
例: @"name CONTAIN[cd] 'ang'"//包含某个字符串
@"name BEGINSWITH[c] 'sh'" //以某个字符串开头
@"name ENDSWITH[d] 'ang'" //以某个字符串结束
5.通配符:LIKE 例:@"name LIKE[cd] 'er'"//代表通配符,Like也接受[cd].
@"name LIKE[cd] '???er'"
: 星号 "
" : 代表0个或多个字符 问号 "?" : 代表一个字符
6.正则表达式:MATCHES 例:NSString regex = @"^A.+e$"; //以A开头,e结尾
@"name MATCHES %@",regex
注:[c]
不区分大小写 , [d]不区分发音符号即没有重音符号, [cd]既不区分大小写,也不区分发音符号。

  1. 合计操作 ANY,SOME:指定下列表达式中的任意元素。比如,ANY children.age < 18。
    ALL:指定下列表达式中的所有元素。比如,ALL children.age < 18。
    NONE:指定下列表达式中没有的元素。比如,NONE children.age < 18。它在逻辑上等于NOT (ANY ...)。
    IN:等于SQL的IN操作,左边的表达必须出现在右边指定的集合中。比如,name IN { 'Ben', 'Melissa', 'Nick' }。
    提示: 1. 谓词中的匹配指令关键字通常使用大写字母
    2. 谓词中可以使用格式字符串
    3. 如果通过对象的key path指定匹配条件,需要使用%K

//创建查询请求实例演示
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
//查询条件
NSPredicate *pre = [NSPredicate predicateWithFormat:@"sex = %@", @"美女"]; r
equest.predicate = pre;
// 从第几页开始显示
// 通过这个属性实现分页
//request.fetchOffset = 0;
// 每页显示多少条数据
//request.fetchLimit = 6;
//发送查询请求 NSArray *resArray = [_context executeFetchRequest:request error:nil]; [self alertViewWithMessage:@"查询所有的美女"];

4.删除数据
// 删除数据
- (void)deleteData{
    
//    先查找出要删除的数据然后再删除
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"stuId = 11"];
    request.predicate = predicate;
    
   NSArray *result = [self.context executeFetchRequest:request error:nil];
    for (Student *obj in result) {
        [self.context deleteObject:obj];
    }
//    如果没有save 的话,数据库并没有真的删掉数据,只是把你缓存的结果删掉了
    [self.context save:nil];
//    再次查找的话,并没有从数据库里查找,重启应用程序还是有的
    [self fetchData];// 查看是否删掉数据
    
    
}
5.修改数据
// 修改数据
- (void)updateData{
//    同删除数据一样,也要先查出要修改的数据,然后再进行修改
    //    先查找出要删除的数据然后再删除
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"stuId = 7"];
    request.predicate = predicate;
    
    NSArray *result = [self.context executeFetchRequest:request error:nil];
    for (Student *obj in result) {
        obj.name = @"王二";
    }
    //    如果没有save 的话,数据库并没有真的删掉数据,只是把你缓存的结果删掉了
    [self.context save:nil];
    //    再次查找的话,并没有从数据库里查找,重启应用程序还是有的
    [self fetchData];// 查看是否删掉数据
   
}

// 调用删除和更新操作
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
// [self deleteData];
[self updateData];
}

下篇文章会介绍CoreData的二次封装,在实际开发中建议使用,可移植性很好,在项目中可以快速开发。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354