亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS App開發中Core Data框架基本的數據管理功能小結

2020-07-26 03:19:19
字體:
來源:轉載
供稿:網友

一、何為CoreData
CoreData是一個專門用來管理數據的框架,其在性能與書寫方便上都有很大的優勢,在數據庫管理方面,apple強烈推薦開發者使用CoreData框架,在apple的官方文檔中稱,使用CoreData框架可以減少開發者50%――70%的代碼量,這雖然有些夸張,但由此可見,CoreData的確十分強大。

二、設計數據模型
在iOS開發中,時常使用SQL數據庫對大量的表結構數據進行處理,但是SQL有一個十分明顯的缺陷,對于常規數據模型的表,其處理起來是沒問題的,例如一個班級表,其中每條數據中有班級名稱,人數這樣的屬性,一個學生表,其中每條數據有學生的姓名,性別,年齡這樣的屬性。但是如果要在表與表之間建立聯系,自定義對象與自定義對象之間產生從屬關系,使用SQL處理起來就十分麻煩了,例如如果這個班級表中有一個班長的屬性,這個屬性是一個學生類型。
1.創建實體類型及其屬性
使用Xcode創建一個工程,在工程中新建一個文件,選擇Core Data分類中的DataModel創建,如下圖:

201662393010769.png (732×519)

這時在Xcode的文件導航區會出現一個以xcdatamodeld為擴展名的文件,這個文件就是數據模型文件,點擊Add Entity按鈕添加一個實體類型,取名為SchoolClass,為這個類型添加兩個屬性,分別為名字name和學生數量stuNum,如下圖:

201662393043714.png (885×899)

2.對實體類型進行設置
在Xcode右側的工具欄中可以對實體類型進行一些設置,選中一個實體類型,如下圖:

201662393110376.png (259×571)

Name設置實體類型的名稱,Abstract Entity設置是否是抽象實體,如果勾選,則此實體不能被實例化,只能被繼承,類似于抽象類,比如定義人為一個實體類型,在定義繼承于人實體類型的老師、學生等來進行實例化。Parent Entity用來選擇父類實體,Class用于設置對應的類的。

3.在實體對象之間建立關系
再創建一個學生類實體Student,添加name和age兩個屬性。選中SchoolClass,在其中的Relationships模塊中點擊+號,來添加一個關系,如下圖:

201662393139323.png (880×490)

這時,SchoolClass實體類型中就有了一個Student類型的班長屬性。如果切換一下編輯風格,可以更加清晰的看到實體類型之間的關系,如下圖:

201662393202625.png (882×871)

4.對屬性和關系進行設置
選中一個屬性或者關系,在右側的工具欄中可以對屬性進行一些設置,如下圖:

201662393221365.png (260×544)

name設置屬性的名字,Optional類型代表可選,即在實例化對象時可以賦值也可以不賦值。Attribute設置屬性的數據類型,Default Value設置數據的默認值。
二、數據模型管理類NSManagedObjectModel

通過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

NSPersistentStoreCoordinator建立數據模型與本地文件或數據庫之間的聯系,通過它將本地數據讀入內存或者將修改過的臨時數據進行持久化的保存。其初始化與鏈接數據持久化接收對象方法如下:

//通過數據模型管理對象進行初始化
- (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

NSManagedObjectContext是進行數據管理的核心類,我們通過這個類來進行數據的增刪改查等操作。其中常用方法如下:

//初始化方法 通過一個并發類型進行初始化 參數枚舉如下:
/*
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;

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美视频免费在线观看| 久久99国产综合精品女同| 中文亚洲视频在线| 日韩网站免费观看高清| 日本国产高清不卡| 国内精品视频一区| 在线免费看av不卡| 国产啪精品视频网站| 九九热精品视频国产| 久久综合国产精品台湾中文娱乐网| 午夜精品一区二区三区在线视| 高清欧美一区二区三区| 狠狠久久五月精品中文字幕| 亚洲精品v欧美精品v日韩精品| 国产精品综合不卡av| 国产精品第一第二| 久久综合色88| 日本三级韩国三级久久| 色先锋久久影院av| 视频在线观看99| 日韩中文字幕在线精品| 欧美xxxx做受欧美.88| 日韩在线欧美在线国产在线| 亚洲人成免费电影| 91美女片黄在线观看游戏| 成人网页在线免费观看| 亚洲激情视频网站| 不卡av在线网站| 美女福利视频一区| 91av在线国产| 亚洲欧美日韩一区二区三区在线| 国产成人黄色av| 成人黄色av网站| 日韩亚洲综合在线| 亚洲永久免费观看| 欧美视频免费在线观看| 色香阁99久久精品久久久| 日韩精品欧美激情| 91精品中国老女人| 亚洲人成电影在线观看天堂色| 精品国产成人av| 国产精品久久久av| 国产成人一区二区三区小说| 久久成人国产精品| 国产精品一香蕉国产线看观看| 亚洲色图色老头| 国产精品狠色婷| 精品一区二区亚洲| 日韩av电影手机在线观看| 日韩精品免费在线| 欧美乱大交做爰xxxⅹ性3| 日韩精品极品在线观看播放免费视频| 亚洲自拍偷拍色图| 91在线观看免费网站| 欧美一级片一区| 国产精品露脸自拍| 国产精品嫩草影院一区二区| 国内免费精品永久在线视频| 亚洲国产精品成人va在线观看| 91精品国产综合久久男男| 国产91精品视频在线观看| 国语自产精品视频在线看| 欧美一级淫片丝袜脚交| 国产精品老牛影院在线观看| 久久五月天色综合| 国产精品久久一| 97免费视频在线播放| 一区二区国产精品视频| 久久久久久国产免费| 欧美在线视频一二三| 久久久亚洲福利精品午夜| 欧美巨乳在线观看| 精品国产欧美一区二区三区成人| 久久久亚洲网站| 日本久久久久亚洲中字幕| 91中文在线观看| 91sao在线观看国产| 91久久精品在线| 国产91对白在线播放| 久久精品小视频| 精品网站999www| 亚洲丝袜在线视频| 国产精品丝袜白浆摸在线| 国产精品人成电影在线观看| 欧美激情在线视频二区| 成人高h视频在线| 国产精品久久久久久亚洲影视| 亚洲国产成人久久| 91精品视频大全| 精品无码久久久久久国产| 国产一区二区丝袜高跟鞋图片| 欧美国产日韩二区| 日本韩国在线不卡| 另类色图亚洲色图| 欧美日韩午夜视频在线观看| 亚洲免费视频观看| 1769国内精品视频在线播放| 亚洲国产另类 国产精品国产免费| 国产精品免费在线免费| 国产精品色午夜在线观看| 国产精品视频地址| 日韩欧美第一页| 91精品国产高清自在线看超| 欧美—级高清免费播放| 久久在线视频在线| 久久精品中文字幕电影| 久久97久久97精品免视看| 久久人人爽人人爽人人片亚洲| 国产精品美女在线| 亚洲一级免费视频| 久青草国产97香蕉在线视频| 欧美亚洲成人精品| 亚洲精品97久久| 亚洲精品色婷婷福利天堂| 欧美黑人性猛交| 视频一区视频二区国产精品| 欧美成人网在线| 国产日韩欧美日韩大片| www.日韩视频| 国内精品模特av私拍在线观看| 亚洲香蕉在线观看| 北条麻妃一区二区在线观看| 国产亚洲精品va在线观看| 久久久亚洲影院| 国内精品在线一区| 久久久久久久久综合| 久久久精品一区| 一区二区三区亚洲| 精品久久久久久久久中文字幕| 久久精品国亚洲| 亚洲mm色国产网站| 国产精品亚发布| 国产精选久久久久久| 国产精品视频大全| 色综合久久精品亚洲国产| 亚洲成人999| 欧美资源在线观看| 亚洲在线免费视频| 91精品视频免费观看| 日韩国产欧美精品一区二区三区| 亚洲免费电影在线观看| 国产午夜精品一区理论片飘花| 国产亚洲精品久久| 性欧美暴力猛交69hd| 成人福利视频网| 国产成人在线一区二区| 亚洲少妇中文在线| 久久99国产精品久久久久久久久| 久久91亚洲精品中文字幕奶水| 精品成人av一区| 色综合五月天导航| 在线观看日韩www视频免费| 美女福利视频一区| 亚洲男人天堂2024| 国产精品日日摸夜夜添夜夜av| 成人午夜激情免费视频| 91在线看www| 欧美一区二粉嫩精品国产一线天| 国产成人激情视频| 在线亚洲男人天堂| 国产精品福利网站| 亚洲欧美日韩一区二区在线| 亚洲精品国产精品乱码不99按摩| 成年人精品视频|