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

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

Persistent Object Store:可以理解为存储持久对象的数据库(例如SQLite,注意Core Data也支持其他类型的数据存储,例如xml、二进制数据等)。 Managed Object Model:对象模型,对应Xcode中创建的模型文件。 Persistent Store Coordinator:对象模型和实体类之间的转换协调器,用于管理不同存储对象的上下文。 Managed Object Context:对象管理上下文,负责实体对象和数据库之间的交互。

Core Data使用

Core Data使用起来相对直接使用SQLite3的API而言更加的面向对象,操作过程通常分为以下几个步骤:

1.创建管理上下文

创建管理上下可以细分为:加载模型文件->指定数据存储路径->创建对应数据类型的存储->创建管理对象上下方并指定存储。

经过这几个步骤之后可以得到管理对象上下文NSManagedObjectContext,以后所有的数据操作都由此对象负责。同时如果是第一次创建上下文,Core Data会自动创建存储文件(例如这里使用SQLite3存储),并且根据模型对象创建对应的表结构。下图为第一次运行生成的数据库及相关映射文件:ios数据存取
为了方便后面使用,NSManagedObjectContext对象可以作为单例或静态属性来保存,下面是创建的管理对象上下文的主要代码:


-(NSManagedObjectContext *)createDbContext{
  NSManagedObjectContext *context;
  //打开模型文件,参数为nil则打开包中所有模型文件并合并成一个
  NSManagedObjectModel *model=[NSManagedObjectModel mergedModelFromBundles:nil];
  //创建解析器
  NSPersistentStoreCoordinator *storeCoordinator=[[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:model];
  //创建数据库保存路径
  NSString *dir=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
  NSLog(@"%@",dir);
  NSString *path=[dir stringByAppendingPathComponent:@"myDatabase.db"];
  NSURL *url=[NSURL fileURLWithPath:path];
  //添加SQLite持久存储到解析器
  NSError *error;
  [storeCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error];
  if(error){
    NSLog(@"数据库打开失败!错误:%@",error.localizedDescription);
  }else{
    context=[[NSManagedObjectContext alloc]init];
    context.persistentStoreCoordinator=storeCoordinator;
    NSLog(@"数据库打开成功!");
  }
  return context;
}

2.查询数据

对于有条件的查询,在Core Data中是通过谓词来实现的。首先创建一个请求,然后设置请求条件,最后调用上下文执行请求的方法。


-(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);
  }
}