iOS开发系列--详细介绍数据存取

2020-01-18 17:36:10王旭

如果有多个条件,只要使用谓词组合即可,那么对于关联对象条件怎么查询呢?这里分为两种情况进行介绍:

a.查找一个对象只有唯一一个关联对象的情况,例如查找用户名为“Binger”的微博(一个微博只能属于一个用户),通过keypath查询


-(NSArray *)getStatusesByUserName:(NSString *)name{
  NSFetchRequest *request=[NSFetchRequest fetchRequestWithEntityName:@"Status"];
  request.predicate=[NSPredicate predicateWithFormat:@"user.name=%@",name];
  NSArray *array=[self.context executeFetchRequest:request error:nil];
  return array;
}

此时如果跟踪Core Data生成的SQL语句会发现其实就是把Status表和User表进行了关联查询(JOIN连接)。

b.查找一个对象有多个关联对象的情况,例如查找发送微博内容中包含“Watch”并且用户昵称为“小娜”的用户(一个用户有多条微博),此时可以充分利用谓词进行过滤。

 


-(NSArray *)getStatusesByUserName:(NSString *)name{
  NSFetchRequest *request=[NSFetchRequest fetchRequestWithEntityName:@"Status"];
  request.predicate=[NSPredicate predicateWithFormat:@"user.name=%@",name];
  NSArray *array=[self.context executeFetchRequest:request error:nil];
  return array;
}

注意如果单纯查找微博中包含“Watch”的用户,直接查出对应的微博,然后通过每个微博的user属性即可获得用户,此时就不用使用额外的谓词过滤条件。

3.插入数据

插入数据需要调用实体描述对象NSEntityDescription返回一个实体对象,然后设置对象属性,最后保存当前上下文即可。这里需要注意,增、删、改操作完最后必须调用管理对象上下文的保存方法,否则操作不会执行。


-(void)addUserWithName:(NSString *)name screenName:(NSString *)screenName profileImageUrl:(NSString *)profileImageUrl mbtype:(NSString *)mbtype city:(NSString *)city{
  //添加一个对象
  User *us= [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:self.context];
  us.name=name;
  us.screenName=screenName;
  us.profileImageUrl=profileImageUrl;
  us.mbtype=mbtype;
  us.city=city;
  NSError *error;
  //保存上下文
  if (![self.context save:&error]) {
    NSLog(@"添加过程中发生错误,错误信息:%@!",error.localizedDescription);
  }
}

4.删除数据

删除数据可以直接调用管理对象上下文的deleteObject方法,删除完保存上下文即可。注意,删除数据前必须先查询到对应对象。


-(void)removeUser:(User *)user{
  [self.context deleteObject:user];
  NSError *error;
  if (![self.context save:&error]) {
    NSLog(@"删除过程中发生错误,错误信息:%@!",error.localizedDescription);
  }
}