IOS对象关系映射(ORM)之coreData框架的学习——(二)原理剖析及使用步骤详解

来源:互联网 发布:苹果二手 淘宝 编辑:程序博客网 时间:2024/05/29 16:29
知识点一:Core Data数据持久化是对SQLite的一个升级,它是IOS集成的框架。它有几个类,大概简介如下:
(1.1)NSManagedObjectModel(被管理的专门用来描述应用程序的数据模型)是包含一个或多个实体的模板,里面描述了实体间的关系。由实体(Entity),特性(Property),读取请求(Fetch Request)等。
(1.2)NSManagedObjectContext(被管理的对象上下文)参与数据对象进行操作的全过程 例如对数据进行更删改查,并检测数据对象的变化,以提供对undo/redo即 撤销和回滚的支持及更新绑定到数据的UI。
(1.3)NSPersistentStoreCoordinator(持久化存储助理)相当于数据库等存储文件的连接器,处理底层的对数据文件的读取和写入。
(1.4)NSManagedObject(被管理的数据对象) 与NSManagedObjectContext相关联,一个实体可以自动生成实体类,一个实体类可以有多个NSManagedObject对象。
(1.5)NSPredicate (谓词:相当于查询条件)。
(1.6)NSEntityDescription(实体结构,与数据库中的一个表结构相对应)
(1.7)后缀名为.xcdatamodeld的包,用于数据模型编辑器编辑。

它们的关系如下图所示:



知识点二:Core Data框架的工作流程如下:
2.1> 应用程序先代码创建或读取模型文件(后缀名为xcdatamodeld)生成NSManagedObjectModel对象。方法如下所示。NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
以上方法是专门从工程中读取模型文件即后缀为.xcdatamodel的文件中读取实体和实体之间的关系。参数参入空则打开包中的所有模型文件即所有.xcdatamodel文件合并成一个。
2.2> 传入模型到初始化持久化助理类。已知要建数据库(或存储文件),首先要建立表结构和表与表之间的关系,而模型文件就相当于一个数据库的设计说明书,里面的每一个实体都对应一张表,实体与实体之间的关系就相当于表与表之间的联系。数据库内部结构就与模板一一对应。 将模型文件传入持久化助理类的具体方法如下:
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:Model];
2.3> 创建数据库路径,一般指定沙盒目录下的Document路径或缓存Cache目录。已经详细复习,在此不在重新奥数。构建路径方法如下所示:
NSString *docs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) firstObject];
NSURL *url = [NSURL fileURLWithPath:[docs stringByAppendingPathComponent:@“person.sqlite”]];
2.4> 往指定的路径添加持久化存储库。被初始化过的持久化助理类会根据传过来的模型利用如下方法在指定的路径创建数据库或别的存储文件。方法如下:
NSError *error = nil;
NSPersistentStore *store = [psc addPersistentStoreWithType: NSSQLiteStoreType configuration:nil URL:url options:nil error: &error];
注意:持久化存储库的类型有如下几种:
NSSQLiteStoreType :SQLite数据库。
NSBinaryStoreType : 二进制平面文件。
NSInMemoryStoreType: 内存库,无法永久保存数据。建议都使用默认的类型即数据库类型
2.5> 创建上下文。 持久化助理类已根据传入模型中的实体建立了与其对应表结构的数据库。为了对数据库中表结构的数据进行增删改查等操作。还要创建上下文对象,为其设置持久化助理类对象。这样上下文对象就能对持久化助理类对象添加的持久化库进行管理了。方法如下:
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];
context.persistentStoreCoordinator = psc;
这样设置以后,psc持久化助理对象所创建的持久化数据库内容的增删改查全部由context负责,而且修改后仍然由context把内容保存到持久化库。
2.6> 获取或创建NSManagedObject对象。已知一个实体对应着一张表,而NSManagedObject对象就对应着表中的某条记录,也可以说是一个实体类的对象。当要往数据库表中添加记录时,就是一个创建实体对象的过程,当从表中查找或增加删除修改符合条件的记录时就是一个获取实体类对象并进行改动的过程。切记:必须利用所在的context对象调用save方法进行保存才能将修改后的数据库内容写入保存到数据库。创建实体类对象的方法如下:
  // 传入上下文,创建一个card实体对象。
NSManagedObject  *card =  [NSEntityDescription insertNewObjectForEntityForName:@“Card”inManagedObjectContext: context];
NSError* error1 = nil;
    BOOL success = [context save:&error1];
    if (!success) {
        [NSException raise:@"访问数据库错误" format:@"%@",  [error1 localizedDescription]];
    }
注意:NSEntityDescription相当于一张表结构。

知识点三:利用上下文对象对数据库内容进行记录删除操作和条件查询操作。具体方法如下所示:
3.1 利用NSFetchRequest类进行查询条件设置
3.1.1 首先为其设置要查询的实体名称,即对应数据库中的一个表,即指明要查询数据库中的哪个表。方法有如下三种:
     方法一
     NSFetchRequest *request = [[NSFetchRequest alloc] init];
     request.entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];
     方法二
     NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
    // 方法三:这种方法最简单
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
3.1.2 然后为其设置排序类NSSortDescriptor的对象,指明输出结果的排序方式。方法如下:
 // 设置排序,按age降序排序
    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:NO];
    request.sortDescriptors = [NSArray arrayWithObject:sort];
3.1.3 还可以为其设置过滤类NSPredicate的对象,指明过滤的条件。
 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like %@",@"*J"];
    request.predicate = predicate;
3.1.4 已经为请求类对象request设置实体和查询条件完毕,开始遍历查询:
  // 执行请求
    NSError *error3 = nil;
    NSArray *objs = [context executeFetchRequest:request error:&error3];
    if (error3) {
        [NSException raise:@"查询错误" format:@"%@",[error3 description]];
    }
 /*遍历数据*/
    for(NSManagedObject *obj in objs)
    {
        NSLog(@"name=%@",[obj valueForKey:@"name"]);
    }

3.2  删除操作——传入需要删除的实体对象
    [context deleteObject:person];
    // 将结果同步到数据库
    NSError * error4 = nil;
    [context save:&error4];
    if (error4) {
        [NSException raise:@"删除错误" format:@"%@", [error4 localizedDescription]];

    }

参考博客网址如下:

推荐博客网址





  

0 0