本人有若干成套學習視頻, 可試看! 可試看! 可試看, 重要的事情說三遍 包含Java
, 數據結構與算法
, iOS
, 安卓
, python
, flutter
等等, 如有需要, 聯系微信tsaievan
.
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 對象數據,如下圖所示
運行結果