美文网首页iOS - 大杂烩
CoreData踩坑经过

CoreData踩坑经过

作者: rainzhang | 来源:发表于2017-11-10 16:20 被阅读22次

    0x01 概述

    参考:http://www.jianshu.com/p/4a36acc32d9b

    使用coredata的多吗,好用吗,调研才有发言权,开干。

    0x02 网上搜索概述

    总体使用较少

    优点:1 不直接操作sqlte语句,容易使用。 2 和系统接口结合。 3 分线程主线程操作方便。

    缺点:1 多个表关联时不好操作。2数据库升级困难。3 学习成本较高。

    0x03 开始入坑

    A 创建Data Mode

    创建data mode文件

    坑的地方是默认是swift,没有oc选项,要想使用oc要创建完成后手动修改,修改方法如下图:

    修改data mode 为oc

    B 为 data mode 创建NSManagedObject

    新建文件里面没有那个选项了,what fack,没了,怎么创建。

    网上搜了下,隐藏在其他位置了,如下图:

    创建 NSManagedObject sub class

    创建完成后,该松口气了,然而实际他还是会让你紧张的。

    编译报错如下:


    懵逼了吧

    搜索之后发现是xcode的bug

    https://stackoverflow.com/questions/40460307/duplicate-symbol-error-when-adding-nsmanagedobject-subclass-duplicate-link

    处理添加NSMangerObject subclass 编译duplicate symbole

    C 保存数据

    1.创建实体,并为实体属性赋值

    Person *p = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];

    p.name = [NSString stringWithFormat:@"大倩倩%d",arc4random()%10];

    p.age = [NSString stringWithFormat:@"%d",arc4random()%60];

    2.保存数据

    [context save:nil];

    ***************************************************************

    3.查询

    建立请求

    NSFetchRequest *request = [[NSFetchRequest alloc] init] ;

    读取实体

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];

    请求连接实体

    request.entity = entity;

    遍历所有实体,将每个实体的信息存放在数组中

    NSArray *arr = [context executeFetchRequest:request error:nil];

    for (Person *p in arr)

    {

        NSLog(@"name=%@,age=%@", p.name,p.age);

    }

    D 读取数据

    NSFetchRequest*request = [[NSFetchRequest alloc]init];

    NSEntityDescription*entity = [NSEntityDescription entityForName:@"Person"inManagedObjectContext:context];

    request.entity= entity;

    NSArray*arr = [context executeFetchRequest:requesterror:nil];

    for(Person*pinarr) {

    NSLog(@"name is: %@",p.name);

    }

    E 修改

    //设置过滤条件

    NSPredicate*predicate = [NSPredicate predicateWithFormat:@"name = %@",@"Tommy"];

    request.predicate= predicate;

    NSArray*arr = [context executeFetchRequest:requesterror:nil];

    for(Person*pinarr) {

        p.name=@"Mini Tommy";

    }

    [context save:nil];

    F 删除

    先查询出符合条件的数据,方法参考D读取数据

    for(Person*pinarr) {

        [context deleteObject:p];

    }

    [contextsave:nil];

    0x04 总结

    总体感觉使用比直接使用sql简单些。

    对于表的关联,数据的升级还没试验。

    相关文章

      网友评论

        本文标题:CoreData踩坑经过

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