CoreData的使用之二

一、导入 库CoreData.framework 和头文件,创建数据模型。

具体的步骤看截图:

图一


图二


图三


图四


图五



二、语法:

a)Entity - NSEntityDescriptionEntity 相当于数据库中的一个表,它描述一种抽象数据类型,其对应的类为 NSManagedObject 或其子类。NSEntityDescription 常用方法:+insertNewObjectForEntityForName:inManagedObjectContext: 工厂方法,根据给定的 Entity 描述,生成相应的 NSManagedObject 对象,并插入 ManagedObjectContext 中。-managedObjectClassName 返回映射到 Entity 的 NSManagedObject 类名-attributesByName 以名字为 key, 返回 Entity 中对应的 Attributes-relationshipsByName 以名字为 key, 返回 Entity 中对应的 Relationships


/*

 在声明property属性后,有2种实现选择

 @synthesize

 编译器期间,让编译器自动生成getter/setter方法。

 当有自定义的存或取方法时,自定义会屏蔽自动生成该方法

 

 @dynamic

 告诉编译器,不自动生成getter/setter方法,避免编译期间产生警告

 然后由自己实现存取方法

 或存取方法在运行时动态创建绑定:主要使用在CoreData的实现NSManagedObject子类时使用,由Core Data框架在程序运行时动态生成子类属性

 */


  @dynamic这个关键词,通常是用不到的。

 它与@synthesize的区别在于:

  使用@synthesize编译器会确实的产生getter和setter方法,而@dynamic仅仅是告诉编译器这两个方法在运行期会有的,无需产生警告。

三、

初始化coreData数据库管理相关对象

 //一,获取数据模型文件(xcdatamodel文件),有两种方式可以获取数据模型文件。

//    //1xxx.xcdatamodeld放在沙盒中变成了xxx.momd 扩展名所以:

//    NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"momd"];

//    NSURL *url = [NSURL fileURLWithPath:path];//把本地资源路径转化为url

//    NSManagedObjectModel *modelFile = [[NSManagedObjectModel alloc] initWithContentsOfURL:url];

    //2,获取沙盒中 所有的xxx.xcdatamodeld创建成对象

    NSManagedObjectModel * modelFile=[NSManagedObjectModel mergedModelFromBundles:nil];

    //二,创建持久存储协调器

    NSPersistentStoreCoordinator * persistentStoreCoordinator=[[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:modelFile];

    //三,指定本地存储的数据库路径

    NSString * sqlitePath=[NSString stringWithFormat:@"%@/Documents/School.sqlite",NSHomeDirectory()];

    NSLog(@"%@",sqlitePath);

    /*

     COREDATA_EXTERN NSString * const NSSQLiteStoreType

     COREDATA_EXTERN NSString * const NSXMLStoreType

     COREDATA_EXTERN NSString * const NSBinaryStoreType

     */

    NSError * error=nil;

    [persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:sqlitePath] options:nil error:&error];

    if (error) {

        NSLog(@"数据库路径添加失败:%@",error);

    }

    //四,创建上下文

    _context=[[NSManagedObjectContext alloc]init];

    _context.persistentStoreCoordinator=persistentStoreCoordinator;

四、coreData的增删改查

a>增加记录

//创建一个模型对象,千万不用用[[Student alloc]init];

    Student * oneStudent=[NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:_context];

    //设置值

    oneStudent.id=[NSNumber numberWithInt:[self.idTF.text intValue]];

    oneStudent.name=self.nameTF.text;

    NSError * error=nil;

    //同步到本地

    [_context save:&error];

    if (error) {

        NSLog(@"插入一个学生失败:%@",error);

    }else{

        NSLog(@"插入一个学生成功");

    }

    b>删除

-(void)deleteWithName:(NSString *)oneName{

    //先找 再删除

    NSArray *arr = [self findDataWithName:self.nameTF.text];

    ///遍历数组

    for (Student *oneStudent in arr) {

        //删除找到的

        [_context deleteObject:oneStudent];

    }

    //上面 执行的是 从内存 数据库 删除

    //下面 要保存才会 同步到本地

    if (![_context save:nil]) {

        NSLog(@"delete error");

    }

}

c>修改

-(void)change{

    //先找 再修改

    NSArray *arr = [self findDataWithName:self.nameTF.text];

    ///遍历数组

    for (Student *oneStudent in arr) {

        oneStudent.id = [NSNumber numberWithInt:[self.idTF.text intValue]];

    }

    //下面 要保存才会 同步到本地

    if (![_context save:nil]) {

        NSLog(@"update error");

    }

}

d>查阅

   //根据名字 向数据库进行查询

- (NSArray *)findDataWithName:(NSString *)newName {

    //1.创建一个查找请求

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

    //1.1设置 查询数据模型

    request.entity  = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:_context];

    /*

     NSPredicate用于查询和过滤

     SQL中作为查询条件通常用WHERE,但在COREDATA中作为查询条件就可以用到NSPredicate.

     NSPredicate 不单可以和COREDATA中的FetchRequest 配合使用。也可以与NSArray配合使用。

     1>,<,>=,<=,= 比较运算符。

     如:

     NSPredicate * qcondition= [NSPredicate predicateWithFormat:@"salary >= 10000"];

     2、字符串操作(包含)BEGINSWITHENDSWITHCONTAINS

     如:

     @"employee.name BEGINSWITH[cd] ''" //姓李的员工

     @"employee.name ENDSWITH[c] ''"   //以梦结束的员工

     @"employee.name CONTAINS[d] ''"   //包含有""字的员工

     :[c]不区分大小写[d]不区分发音符号即没有重音符号[cd]既不区分大小写,也不区分发音符号。

     3、范围:IN   BWTEEN

     如:

     @"salary BWTEEN {5000,10000}"

     @"em_dept IN '开发'"

     4、自身:SELF,这个只针对字符数组起作用。

     如:

     NSArray * test = =[NSArray arrayWithObjects: @"guangzhou", @"beijing", @"shanghai", nil];

     @"SELF='beijing'"

     5、通配符:LIKE

     LIKE 使用?表示一个字符,*表示多个字符,也可以与cd 连用。

     如:

     @"car.name LIKE '?he?'" //四个字符中,中间为he

     @"car.name LIKE '*jp'"   //jp结束

     6、正则表达式:MATCHES

     如:

     NSString *regex = @"^E.+e$";//E 开头,以e 结尾的字符。

     NSPredicate *pre= [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];

     if([pre evaluateWithObject: @"Employee"]){

     NSLog(@"matches YES");

     }else{

     NSLog(@"matches NO");

     }

     7、逻辑运算符:ANDORNOT

     如:

     @"employee.name = 'john' AND employee.age = 28"

     8、占位符:

     NSPredicate *preTemplate = [NSPredicate predicateWithFormat:@"name==$NAME"];

     NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys:

     @"Name1", @"NAME",nil];

     NSPredicate *pre=[preTemplate predicateWithSubstitutionVariables: dic];

     占位符就是字典对象里的key,因此你可以有多个占位符,只要key 不一样就可以了。

     */

    //1.2设置谓词

    //如果 不设置谓词 默认 查询 数据库所有的数据

    if (newName) {

        //如果 newName 有值 根据名字找 设置谓词

        //谓词 @"name like xiaohong"--》表示 查询 数据库 中数据模型 属性name xiaohong的所有的模型对象

        //模糊查询@"name like *xiaohong*"//查询 包含 xiaohong 字符串的name属性

        /*

         NSString *str = [NSString stringWithFormat:@"name like *%@*",newName];

         request.predicate = [NSPredicate predicateWithFormat:str];

         */

        request.predicate = [NSPredicate predicateWithFormat:@"name like %@",newName];

    }

    //1.3设置排序准则(如果需要)

    //实例化排序准则

    //按照 age 属性的值 降序 排列

    NSSortDescriptor *sort1 = [NSSortDescriptor sortDescriptorWithKey:@"id" ascending:YES];

    //按照属性 name 的值 升序排列

    NSSortDescriptor *sort2 = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];

    //如果 按照 sort1排序 age 出现相同 ,那么再按照sort2name 升序排序

    request.sortDescriptors = @[sort1,sort2];

    //执行查询 函数

    return [_context executeFetchRequest:request error:nil];

}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值