zoukankan      html  css  js  c++  java
  • CoreData / MagicalRecord

    CoreData

    之前在学习使用SQLite时, 需要编写大量的sql语句,完成数据的增删改查,但对于不熟悉sql语句的开发人员来说,难度较大,调试程序比较困难。由此出现CoreData框架,将sql的操作转换成为对象的操作,无需编写sql语句。并且对数据库的操作也可以可视化。

    1. CoreData 自iOS5出现的框架,提供了对象-关系映射(ORM)功能。通过此框架可将 对象 转化成数据,存储到SQLite 数据库文件中,也能将SQLite数据库中的数据转化成对象。CoreData实际上是封装了的SQLite操作的库,封装度高,无需开发人员接触SQL语句。

       数据库中的数据(表)与对象的关系,如下图:

       

            

       在CoreData中,需要被映射的对象被称为实体(entity),即sqlite中的表;每个实体都有属性,即sqlite中对应表的字段。

        > 使用CoreData 

           — 先创建模型文件(相当于创建数据库表结构),后缀名 xcdatamodeld

               两种方式创建:

               a. 可以在创建iOS 工程时,选择 use Core Data, 工程中会自动生成模型文件

               b. 创建工程后 New file ,选择iOS ->Core Data -> Data Model

           — 添加实体,(添加表)

               Add Entity 注意:实体名字首字母大写

           — 给实体添加属性 (在表中添加字段)

               Attributes -> +  注意:实体属性名字首字母小写

           — 如何通过代码访问

               先了解CoreData 中的核心对象

               1.) Managed Object Model  管理的对象模型

                 描述应用程序的数据模型,这个模型包含实体(Entity),属性(Property),读取请求(Fetch Request)等。 对应代码中的类:NSManagedObject ,类似于NSDictionary , 通过键-值存取实体属性。

                 2.)Managed Object Context 管理的对象上下文

                 参与对数据对象进行各种操作的全过程,并监测数据对象的变化,以提供对 undo/redo 的支持及更新绑定到数据的 UI。

                 3.)Persistent Store Coordinator 持久化存储协调者

                 相当于数据文件管理器,处理底层的对数据文件的读取与写入。一般我们无需与它打交道。

                 4. )Managed Object 管理的对象

                 数据对象,与 Managed Object Context 相关联。

           — 代码访问步骤:

               1. )初始化NSManagedObjectModel对象,加载模型文件,读取app中的所有实体信息

                 2. )初始化NSPersistentStoreCoordinator对象,添加持久化库(这里采取SQLite数据库)

                 3. )初始化NSManagedObjectContext对象,拿到这个上下文对象操作实体,进行增删改查(CRUD)操作

                  代码如下:

                  // 获取应用程序资源束下的数据实体

                  NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];

              // 以获取的实体初始化持久化存储的协调者(中间桥梁)

          NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

              // 在指定目录下创建持久化存储,基于sqlite类型

          NSString *docs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

              NSURL *url = [NSURL fileURLWithPath:[docs stringByAppendingPathComponent:@"my.db"]];

              NSError *err = nil;

              NSPersistentStore *store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&err];

        // 若创建持久化存储失败,则抛出异常

        if (store == nil) {

            NSLog(@"error");

            [NSException raise:@"error" format:@"%@",[err localizedDescription]];

        }

              // 创建数据操作的上下文,并指定其持久化存储的协调者

              context = [[NSManagedObjectContext alloc] init];

              context.persistentStoreCoordinator = psc;       

           — 将Core Data中的 实体 与 代码中的 数据模型 对应

               Core Data中的实体都是NSManagedObject类型的。

               创建继承自NSManagedObject的子类

               New file->iOS->Core Data-> NSManagedObject

               这样在代码中可通过 favorite.NewsId 来访问实体属性,而不是之前的 [nsManagedObject setValue: forKey:], [nsManagedObject valueForKey:];

           -- 增,删,改,查

                增: // 先以数据实体为原型生成一个实体对象

                       Favorite *fr = [NSEntityDescription insertNewObjectForEntityForName:@"Favorite" inManagedObjectContext:context];

                       // 赋值操作

                       // 通过上下文保存此次增加

                       [context save:&err];

                删:// 先初始化抓取数据的请求,指定其抓取何种类型的实体对象

                      [[NSFetchRequest alloc] initWithEntityName:@"Favorite"];

                      // 指定其筛选数据的条件

                      request.predicate = [NSPredicate predicateWithFormat:@"newsId = %@",@(objId)];

                      // 执行抓取请求

                      [context executeFetchRequest:request error:nil];

                      // 删除找到的数据

                      [context deleteObject:obj];

                       // 务必通过上下文同步到数据存储

                       [context save:&err];

                 改: // 先初始化抓取数据的请求,指定其抓取何种类型的实体对象

                      [[NSFetchRequest alloc] initWithEntityName:@"Favorite"];

                      // 指定其筛选数据的条件

                      request.predicate = [NSPredicate predicateWithFormat:@"newsId = %@",@(objId)];

                      // 执行抓取请求

                      [context executeFetchRequest:request error:nil];

                      // 修改实体对象的值

                      // 务必通过上下文同步到数据存储

                       [context save:&err];

                

                   查: // 先初始化抓取数据的请求,指定其抓取何种类型的实体对象

                      [[NSFetchRequest alloc] initWithEntityName:@"Favorite"];

                      // 指定其筛选数据的条件

                      request.predicate = [NSPredicate predicateWithFormat:@"newsId = %@",@(objId)];

                      // 执行抓取请求

                      [context executeFetchRequest:request error:nil];

    MagicalRecord================================================

    1. 官网:https://github.com/magicalpanda/MagicalRecord

       MagicalRecord是对CoreData的深度封装。使CoreData 代码更简洁,更简单的获取数据,并使用最优化的操作。

       > 使用方法:

          — 将MagicalRecord 拖曳到工程目录下,并添加CoreData框架。

          — 创建CoreData 数据模型DataModel,并创建实体Entity及属性Attribute

          — 创建与数据模型中实体对应的类 ,继承自NSManagedObject

          — 初始化CoreData堆栈 ,在AppDelegate 中

               - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

        // Override point for customization after application launch.

        [MagicalRecord setupCoreDataStackWithStoreNamed:@"fav"];

        return YES;

    }

           — 数据增删改查

               增:[Fav MR_createEntity];

                   // 对创建的新实体赋值

                   // 同步存储到持久化库中

                   [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];

              删:[favmodel MR_deleteEntity];

                   // 同步存储到持久化库中

                   [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];

              改:// 先查询出要修改的记录   

                     [Fav MR_findFirstByAttribute:@"newsId" withValue:@(m.newsId.integerValue)];

                   // 更新查出的实体的值

                   // 同步存储到持久化库中

                   [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];

              查:[Fav MR_findAll];  // 查询出所有记录

  • 相关阅读:
    快速排序算法
    学习了几天的jQuery Mobile的一点感受
    jQuery Mobile 图标无法显示
    html5基础知识
    百度地图与谷歌地图 (常识、区别,更倾向于使用百度地图,纠错信息比谷歌多)
    (转)百度Map API
    历年软件设计师下午考试试题汇总统计
    HTML5的本地存储
    EnterpriseArchitectect 软件的勾选的几个选项对应的中文意思
    访问权限控制表
  • 原文地址:https://www.cnblogs.com/GJ-ios/p/5712992.html
Copyright © 2011-2022 走看看