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 对象数据,如下图所示
运行结果
网友评论