天天看點

iOS中CoreData資料管理系列二——CoreData架構中三個重要的類

    在上一篇部落格中,介紹了ios中使用coredata架構設計資料模型的相關步驟。coredata架構中通過相關的類将資料——資料模型——開發者無縫的銜接起來。nsmanagedobjectmodel對應資料模型,即上篇部落格中我們建立的.xcdatamodeld檔案;nspersistentstorecoordinator相當于資料庫與資料模型之間的橋接器,通過nspersistentstorecoordinator将資料模型存入資料庫;nsmanagedobjectcontext是核心的資料管理類,開發者通過操作它來執行對資料的相關操作。

    通過nsmanagedobjectmodel,可以将建立的資料模型檔案讀取為模型管理類對象,使用如下方法:

<a href="http://my.oschina.net/u/2340880/blog/610948#">?</a>

1

2

3

4

<code>    </code><code>//擷取.xcdatamodeld檔案url</code>

<code>    </code><code>nsurl *modelurl = [[nsbundle mainbundle]urlforresource:@</code><code>"model"</code> <code>withextension:@</code><code>"momd"</code><code>];</code>

<code>    </code><code>//讀取檔案</code>

<code>    </code><code>nsmanagedobjectmodel * mom = [[nsmanagedobjectmodel alloc]initwithcontentsofurl:modelurl];</code>

其中還有一些屬性和方法進行資料模型的管理:

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<code>//将多個資料模型管理檔案進行合并</code>

<code>+ (nullable nsmanagedobjectmodel *)mergedmodelfrombundles:(nullable nsarray&lt;nsbundle *&gt; *)bundles;  </code>

<code>//将多個資料模型管理類對象進行合并 </code>

<code>+ (nullable nsmanagedobjectmodel *)modelbymergingmodels:(nullable nsarray&lt;nsmanagedobjectmodel *&gt; *)models;</code>

<code>//存放資料中所有實體模型的字典 字典中是實體名和實體描述對象</code>

<code>@property (readonly, copy) nsdictionary&lt;nsstring *, nsentitydescription *&gt; *entitiesbyname;</code>

<code>//存放資料中所有實體描述對象</code>

<code>@property (strong) nsarray&lt;nsentitydescription *&gt; *entities;</code>

<code>//傳回所有可用的配置名稱</code>

<code>@property (readonly, strong) nsarray&lt;nsstring *&gt; *configurations;</code>

<code>//擷取關聯某個配置的所有實體</code>

<code>- (nullable nsarray&lt;nsentitydescription *&gt; *)entitiesforconfiguration:(nullable nsstring *)configuration;</code>

<code>//為某個實體關聯配置</code>

<code>- (</code><code>void</code><code>)setentities:(nsarray&lt;nsentitydescription *&gt; *)entities forconfiguration:(nsstring *)configuration;</code>

<code>//建立請求模闆</code>

<code>- (</code><code>void</code><code>)setfetchrequesttemplate:(nullable nsfetchrequest *)fetchrequesttemplate forname:(nsstring *)name;</code>

<code>//擷取請求模闆</code>

<code>- (nullable nsfetchrequest *)fetchrequesttemplateforname:(nsstring *)name;</code>

關于實體描述對象nsentitydescription:

實體類似于資料庫中的表結構,例如上次我們建立的班級實體模型,一個實體模型中可以添加許多屬性與關系,nsentitydescription對象中存放這些資訊,常用如下:

19

20

21

22

23

24

25

26

<code>//實體所在的模型管理對象</code>

<code>@property (readonly, assign) nsmanagedobjectmodel *managedobjectmodel;</code>

<code>//實體所在的模型管理對象的名稱</code>

<code>@property (null_resettable, copy) nsstring *managedobjectclassname;</code>

<code>//實體名</code>

<code>@property (nullable, copy) nsstring *name;</code>

<code>//設定是否是抽象實體</code>

<code>@property (getter=isabstract) </code><code>bool</code> <code>abstract;</code>

<code>//子類實體字典</code>

<code>@property (readonly, copy) nsdictionary&lt;nsstring *, nsentitydescription *&gt; *subentitiesbyname;</code>

<code>//所有子類實體對象數組</code>

<code>@property (strong) nsarray&lt;nsentitydescription *&gt; *subentities;</code>

<code>//父類實體</code>

<code>@property (nullable, readonly, assign) nsentitydescription *superentity;</code>

<code>//所有屬性字典</code>

<code>@property (readonly, copy) nsdictionary&lt;nsstring *, __kindof nspropertydescription *&gt; *propertiesbyname;</code>

<code>//所有屬性數組 </code>

<code>@property (strong) nsarray&lt;__kindof nspropertydescription *&gt; *properties;</code>

<code>//所有常類型屬性</code>

<code>@property (readonly, copy) nsdictionary&lt;nsstring *, nsattributedescription *&gt; *attributesbyname;</code>

<code>//所有關系</code>

<code>@property (readonly, copy) nsdictionary&lt;nsstring *, nsrelationshipdescription *&gt; *relationshipsbyname;</code>

<code>//某個實體類型的所有關系</code>

<code>- (nsarray&lt;nsrelationshipdescription *&gt; *)relationshipswithdestinationentity:(nsentitydescription *)entity;</code>

<code>//判斷是否是某種實體</code>

<code>- (</code><code>bool</code><code>)iskindofentity:(nsentitydescription *)entity;</code>

nspropertydescription類是資料模型屬性的父類,nsattributedescription和nsrelationshipdescription都是繼承于nspropertydescription類,nsattributedescription描述正常類型的屬性,nsrelationshipdescription用于描述自定義類型的關系。

    nspersistentstorecoordinator建立資料模型與本地檔案或資料庫之間的聯系,通過它将本地資料讀入記憶體或者将修改過的臨時資料進行持久化的儲存。其初始化與連結資料持久化接收對象方法如下:

<code>//通過資料模型管理對象進行初始化</code>

<code>- (instancetype)initwithmanagedobjectmodel:(nsmanagedobjectmodel *)model;</code>

<code>//添加一個持久化的資料接收對象</code>

<code>- (nullable __kindof nspersistentstore *)addpersistentstorewithtype:(nsstring *)storetype configuration:(nullable nsstring *)configuration url:(nullable nsurl *)storeurl options:(nullable nsdictionary *)options error:(nserror **)error;</code>

<code>//移除一個持久化的資料接收對象</code>

<code>- (</code><code>bool</code><code>)removepersistentstore:(nspersistentstore *)store error:(nserror **)error;</code>

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

27

28

29

30

31

32

<code>//初始化方法 通過一個并發類型進行初始化 參數枚舉如下:</code>

<code>/*</code>

<code>typedef ns_enum(nsuinteger, nsmanagedobjectcontextconcurrencytype) {</code>

<code>    </code><code>nsprivatequeueconcurrencytype       = 0x01,//上下文對象與私有隊列關聯</code>

<code>    </code><code>nsmainqueueconcurrencytype          = 0x02//上下文對象與主隊列關聯</code>

<code>};</code>

<code>*/</code>

<code>- (instancetype)initwithconcurrencytype:(nsmanagedobjectcontextconcurrencytype)ct;</code>

<code>//異步執行block</code>

<code>- (</code><code>void</code><code>)performblock:(</code><code>void</code> <code>(^)())block;</code>

<code>//同步執行block</code>

<code>- (</code><code>void</code><code>)performblockandwait:(</code><code>void</code> <code>(^)())block;</code>

<code>//關聯資料持久化對象</code>

<code>@property (nullable, strong) nspersistentstorecoordinator *persistentstorecoordinator;</code>

<code>//是否有未送出的更改</code>

<code>@property (nonatomic, readonly) </code><code>bool</code> <code>haschanges;</code>

<code>//進行查詢資料請求</code>

<code>- (nullable nsarray *)executefetchrequest:(nsfetchrequest *)request error:(nserror **)error;</code>

<code>//進行查詢資料條數請求</code>

<code>- (nsuinteger) countforfetchrequest: (nsfetchrequest *)request error: (nserror **)error ; </code>

<code>//插入元素</code>

<code>- (</code><code>void</code><code>)insertobject:(nsmanagedobject *)object;</code>

<code>//删除元素</code>

<code>- (</code><code>void</code><code>)deleteobject:(nsmanagedobject *)object;</code>

<code>//復原一步操作</code>

<code>- (</code><code>void</code><code>)undo;</code>

<code>//清楚緩存</code>

<code>- (</code><code>void</code><code>)reset;</code>

<code>//還原資料</code>

<code>- (</code><code>void</code><code>)rollback;</code>

<code>//送出儲存資料</code>

<code>- (</code><code>bool</code><code>)save:(nserror **)error;</code>

<code></code>