美文网首页很棒的,苹果公司的亲儿子
利用 CoreData持久化存储数据至 SQLite

利用 CoreData持久化存储数据至 SQLite

作者: 小冰山口 | 来源:发表于2016-09-27 02:06 被阅读322次
    CoreData 是苹果官方为我们封装的一个框架,用来持久化存储数据.让我们彻底摆脱 SQL 语句,非常的方便,下面,简单介绍一下 CoreData 的工作原理

    CoreDataStack结构如下图所示:

    CoreDataStack结构
    实际上,我们真正要使用的就是存储调度器层级以上的部分,那么就涉及三个关键的类
    • NSManagedObjectContext(管理对象上下文)
    • NSMangedObjectModel(管理对象模型)
    • NSPersistantStoreCoordinator(持久存储调度器)
    我们先新建一个 Demo 来模拟利用 CoreData框架来搭建数据库并存储数据
    • 既然涉及到以上三个类,我们就创建一个数据管理类,并使用单例模式,让以上三个类成为这个管理类的属性
      代码如下
      YFCoreDataManager.h 文件
    #import <Foundation/Foundation.h>
    
    #import <CoreData/CoreData.h>
    
    #define kYFCoreDataManager [YFCoreDataManager sharedManager]
    
    @interface YFCoreDataManager : NSObject
    
    
    /* 提供一个创建单例的方法
     */
    + (instancetype)sharedManager;
    
    /* 提供一个创建数据库并保存的方法
     */
    - (void)save;
    
    /* 管理对象上下文 */
    @property (nonatomic,strong)NSManagedObjectContext *managedObjectContext;
    
    /*  管理对象模型 */
    @property (nonatomic,strong)NSManagedObjectModel *managedObjectModel;
    
    /* 持久存储调度器 */
    @property (nonatomic,strong)NSPersistentStoreCoordinator *persistentStoreCoordinator;
    
    @end
    

    YFCoreDataManager.m 文件

    #import "YFCoreDataManager.h"
    
    @implementation YFCoreDataManager
    
    #pragma mark *** 创建一个管理数据的单例对象 ***
    + (instancetype)sharedManager
    {
        static YFCoreDataManager *manager = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            manager = [[YFCoreDataManager alloc]init];
        });
        
        return manager;
    }
    
    #pragma mark *** 获取沙盒路径的URL地址 ***
    
    - (NSURL *) getDocumentsURL
    {
        /* 用这个文件管理的单例来生成沙盒路径的 URL */
        
        NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
        
        /* 打印沙盒路径来验证是否创建数据库成功 */
        NSLog(@"%@",url);
        return url;
    }
    
    
    #pragma mark *** 懒加载各个属性 ***
    
    // -------- 懒加载管理对象上下文 --------
    
    - (NSManagedObjectContext *)managedObjectContext
    {
        
        /* NSPrivateQueueConcurrencyType 私有队列
         * NSMainQueueConcurrencyType    主队列
         */
        
        /* 一般使用主队列类型 */
        if (!_managedObjectContext) {
            _managedObjectContext = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType];
            
            /* 管理对象上下文还要设置持久存储调度器,这一点一定不能忘 */
            [_managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];
        }
        
        return _managedObjectContext;
    }
    
    // -------- 懒加载管理对象模型 --------
    - (NSManagedObjectModel *)managedObjectModel
    {
        
        
        if (!_managedObjectModel) {
            
            /* 管理对象模型一定要给出".xcdatamodeld"文件的沙盒路径,但后缀名不能填写xcdatamodeld,而是 momd */
            _managedObjectModel = [[NSManagedObjectModel alloc]initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"CoreDataTestDemo" withExtension:@"momd"]];
        }
        
        return _managedObjectModel;
    }
    
    // -------- 懒加载持久存储调度器 --------
    - (NSPersistentStoreCoordinator *)persistentStoreCoordinator
    {
        if (!_persistentStoreCoordinator) {
            
            // -------- 初始化对象的步骤 --------
            
            /* 1. 初始化对象,给对象开辟内存空间 */
            _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:self.managedObjectModel];
            
            /*
             
             // Persistent store types supported by Core Data:
             
             
             COREDATA_EXTERN NSString * const NSSQLiteStoreType NS_AVAILABLE(10_4, 3_0);
             COREDATA_EXTERN NSString * const NSXMLStoreType NS_AVAILABLE(10_4, NA);
             COREDATA_EXTERN NSString * const NSBinaryStoreType NS_AVAILABLE(10_4, 3_0);
             COREDATA_EXTERN NSString * const NSInMemoryStoreType NS_AVAILABLE(10_4, 3_0);
             
             */
            
            /**
             *  @author Tsaievan
             *
             *  Type:我们选择NSSQLiteStoreType
             *  configuration: 一般不配置
             *  URL: 需要选择数据库文件所在的 URL 地址:[[self getDocumentsURL] URLByAppendingPathComponent:@"sqlite.sqlite"]
             */
            
            /* 2. 给持久存储调度设置持久存储类型,并给出创建数据库文件的 URL 地址 */
            [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[[self getDocumentsURL] URLByAppendingPathComponent:@"sqlite.sqlite"] options:nil error:nil];
        }
        
        return _persistentStoreCoordinator;
    }
    
    #pragma mark *** 保存数据 ***
    - (void)save
    {
        [self.managedObjectContext save:nil];
    }
    
    @end
    
    • 当我们在创建项目的时候勾选了 CoreData 时,就会出现下面的文件


      xcdatamodeld 文件
    • 选中这个文件并添加实体


      添加实体
    • 修改实体名称

    修改实体名称
    • 添加属性
    添加属性
    • 创建分类
    创建分类

    此时,就会看到我们创建的Student 类就是继承自 NSManagedObject,而不是 NSObject.
    此时我们在创建 Student 对象就不再是 [[Student alloc]init]了,而是以下代码

    note:请注意 touchesBegan方法中的创建对象的方法,涉及到了实体描述器
    #import "ViewController.h"
    #import "Student+CoreDataProperties.h"
    #import "YFCoreDataManager.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
        Student *student = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:kYFCoreDataManager.managedObjectContext];
        student.name = @"tsaievan";
        student.age = @29;
        
        [kYFCoreDataManager save];
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end
    

    所以当我们点击屏幕时,就会按指定的路径,创建 SQLite 数据库,并插入一条Student 对象数据,如下图所示


    运行结果

    相关文章

      网友评论

        本文标题:利用 CoreData持久化存储数据至 SQLite

        本文链接:https://www.haomeiwen.com/subject/fmrcyttx.html