在上一篇博客中,介紹了iOS中使用CoreData框架設計數據模型的相關步驟。CoreData框架中經過相關的類將數據——數據模型——開發者無縫的銜接起來。NSManagedObjectModel對應數據模型,即上篇博客中咱們建立的.xcdatamodeld文件;NSPersistentStoreCoordinator至關於數據庫與數據模型之間的橋接器,經過NSPersistentStoreCoordinator將數據模型存入數據庫;NSManagedObjectContext是核心的數據管理類,開發者經過操做它來執行對數據的相關操做。數據庫
經過NSManagedObjectModel,能夠將建立的數據模型文件讀取爲模型管理類對象,使用以下方法:數組
//獲取.xcdatamodeld文件url NSURL *modelUrl = [[NSBundle mainBundle]URLForResource:@"Model" withExtension:@"momd"]; //讀取文件 NSManagedObjectModel * mom = [[NSManagedObjectModel alloc]initWithContentsOfURL:modelUrl];
其中還有一些屬性和方法進行數據模型的管理:緩存
//將多個數據模型管理文件進行合併 + (nullable NSManagedObjectModel *)mergedModelFromBundles:(nullable NSArray<NSBundle *> *)bundles; //將多個數據模型管理類對象進行合併 + (nullable NSManagedObjectModel *)modelByMergingModels:(nullable NSArray<NSManagedObjectModel *> *)models; //存放數據中全部實體模型的字典 字典中是實體名和實體描述對象 @property (readonly, copy) NSDictionary<NSString *, NSEntityDescription *> *entitiesByName; //存放數據中全部實體描述對象 @property (strong) NSArray<NSEntityDescription *> *entities; //返回全部可用的配置名稱 @property (readonly, strong) NSArray<NSString *> *configurations; //獲取關聯某個配置的全部實體 - (nullable NSArray<NSEntityDescription *> *)entitiesForConfiguration:(nullable NSString *)configuration; //爲某個實體關聯配置 - (void)setEntities:(NSArray<NSEntityDescription *> *)entities forConfiguration:(NSString *)configuration; //建立請求模板 - (void)setFetchRequestTemplate:(nullable NSFetchRequest *)fetchRequestTemplate forName:(NSString *)name; //獲取請求模板 - (nullable NSFetchRequest *)fetchRequestTemplateForName:(NSString *)name;
關於實體描述對象NSEntityDescription:併發
實體相似於數據庫中的表結構,例如上次咱們建立的班級實體模型,一個實體模型中能夠添加許多屬性與關係,NSEntityDescription對象中存放這些信息,經常使用以下:框架
//實體所在的模型管理對象 @property (readonly, assign) NSManagedObjectModel *managedObjectModel; //實體所在的模型管理對象的名稱 @property (null_resettable, copy) NSString *managedObjectClassName; //實體名 @property (nullable, copy) NSString *name; //設置是不是抽象實體 @property (getter=isAbstract) BOOL abstract; //子類實體字典 @property (readonly, copy) NSDictionary<NSString *, NSEntityDescription *> *subentitiesByName; //全部子類實體對象數組 @property (strong) NSArray<NSEntityDescription *> *subentities; //父類實體 @property (nullable, readonly, assign) NSEntityDescription *superentity; //全部屬性字典 @property (readonly, copy) NSDictionary<NSString *, __kindof NSPropertyDescription *> *propertiesByName; //全部屬性數組 @property (strong) NSArray<__kindof NSPropertyDescription *> *properties; //全部常類型屬性 @property (readonly, copy) NSDictionary<NSString *, NSAttributeDescription *> *attributesByName; //全部關係 @property (readonly, copy) NSDictionary<NSString *, NSRelationshipDescription *> *relationshipsByName; //某個實體類型的全部關係 - (NSArray<NSRelationshipDescription *> *)relationshipsWithDestinationEntity:(NSEntityDescription *)entity; //判斷是不是某種實體 - (BOOL)isKindOfEntity:(NSEntityDescription *)entity;
NSPropertyDescription類是數據模型屬性的父類,NSAttributeDescription和NSRelationshipDescription都是繼承於NSPropertyDescription類,NSAttributeDescription描述正常類型的屬性,NSRelationshipDescription用於描述自定義類型的關係。異步
NSPersistentStoreCoordinator創建數據模型與本地文件或數據庫之間的聯繫,經過它將本地數據讀入內存或者將修改過的臨時數據進行持久化的保存。其初始化與連接數據持久化接收對象方法以下:fetch
//經過數據模型管理對象進行初始化 - (instancetype)initWithManagedObjectModel:(NSManagedObjectModel *)model; //添加一個持久化的數據接收對象 - (nullable __kindof NSPersistentStore *)addPersistentStoreWithType:(NSString *)storeType configuration:(nullable NSString *)configuration URL:(nullable NSURL *)storeURL options:(nullable NSDictionary *)options error:(NSError **)error; //移除一個持久化的數據接收對象 - (BOOL)removePersistentStore:(NSPersistentStore *)store error:(NSError **)error;
NSManagedObjectContext是進行數據管理的核心類,咱們經過這個類來進行數據的增刪改查等操做。其中經常使用方法以下:atom
//初始化方法 經過一個併發類型進行初始化 參數枚舉以下: /* typedef NS_ENUM(NSUInteger, NSManagedObjectContextConcurrencyType) { NSPrivateQueueConcurrencyType = 0x01,//上下文對象與私有隊列關聯 NSMainQueueConcurrencyType = 0x02//上下文對象與主隊列關聯 }; */ - (instancetype)initWithConcurrencyType:(NSManagedObjectContextConcurrencyType)ct; //異步執行block - (void)performBlock:(void (^)())block; //同步執行block - (void)performBlockAndWait:(void (^)())block; //關聯數據持久化對象 @property (nullable, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator; //是否有未提交的更改 @property (nonatomic, readonly) BOOL hasChanges; //進行查詢數據請求 - (nullable NSArray *)executeFetchRequest:(NSFetchRequest *)request error:(NSError **)error; //進行查詢數據條數請求 - (NSUInteger) countForFetchRequest: (NSFetchRequest *)request error: (NSError **)error ; //插入元素 - (void)insertObject:(NSManagedObject *)object; //刪除元素 - (void)deleteObject:(NSManagedObject *)object; //回滾一步操做 - (void)undo; //清楚緩存 - (void)reset; //還原數據 - (void)rollback; //提交保存數據 - (BOOL)save:(NSError **)error;
專一技術,熱愛生活,交流技術,也作朋友。url
——琿少 QQ羣:203317592spa