青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

羅朝輝(飄飄白云)

關注嵌入式操作系統,移動平臺,圖形開發。-->加微博 ^_^

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  85 隨筆 :: 0 文章 :: 169 評論 :: 0 Trackbacks
深入淺出 Cocoa 之 Core Data(1)  - 框架詳解

CC 許可,轉載請注明出處

Core data 是 Cocoa 中處理數據,綁定數據的關鍵特性,其重要性不言而喻,但也比較復雜。Core Data 相關的類比較多,初學者往往不太容易弄懂。計劃用三個教程來講解這一部分:

框架詳解:講解  Core data 框架,運作過程,設計的類;
Core data應用程序示例:通過生成一個使用 Core data 的應用程序來講解如何 在  XCode 4 中使用 Core data。
手動創建Core data示例:不利用框架自動生成代碼,完全自己編寫所有的 Core data 相關代碼的命令行應用程序來深入講解 Core data的使用。

本文為第一部份:框架詳解

一,概觀
下面先給出一張類關系圖,讓我們對它有個總體的認識。



在上圖中,我們可以看到有五個相關模塊:
1, Managed Object Model
Managed Object Model 是描述應用程序的數據模型,這個模型包含實體(Entity),特性(Property),讀取請求(Fetch Request)等。(下文都使用英文術語。)

2,Managed Object Context
Managed Object Context 參與對數據對象進行各種操作的全過程,并監測數據對象的變化,以提供對 undo/redo 的支持及更新綁定到數據的 UI。

3,Persistent Store Coordinator
Persistent Store Coordinator 相當于數據文件管理器,處理底層的對數據文件的讀取與寫入。一般我們無需與它打交道。

4,Managed Object
Managed Object 數據對象,與 Managed Object Context 相關聯。

5,Controller
圖中綠色的 Array Controller, Object Controller, Tree Controller 這些控制器,一般都是通過 control+drag 將 Managed Object Context 綁定到它們,這樣我們就可以在 nib 中可視化地操作數據。

這寫模塊是怎樣運作的呢?

1,應用程序先創建或讀取模型文件(后綴為xcdatamodeld)生成 NSManagedObjectModel 對象。Document應用程序是一般是通過 NSDocument 或其子類 NSPersistentDocument)從模型文件(后綴為 xcdatamodeld)讀取。
2,然后生成 NSManagedObjectContext 和 NSPersistentStoreCoordinator 對象,前者對用戶透明地調用后者對數據文件進行讀寫。
3,NSPersistentStoreCoordinator 負責從數據文件(xml, sqlite,二進制文件等)中讀取數據生成 Managed Object,或保存 Managed Object 寫入數據文件。
4,NSManagedObjectContext 參與對數據進行各種操作的整個過程,它持有 Managed Object。我們通過它來監測 Managed Object。監測數據對象有兩個作用:支持 undo/redo 以及數據綁定。這個類是最常被用到的。
5,Array Controller, Object Controller, Tree Controller 這些控制器一般與 NSManagedObjectContext 關聯,因此我們可以通過它們在 nib 中可視化地操作數據對象。


二, Model class

模型有點像數據庫的表結構,里面包含 Entry, 實體又包含三種 Property:Attribute(屬性),RelationShip(關系), Fetched Property(讀取屬性)。Model class 的名字多以 "Description" 結尾。我們可以看出:模型就是描述數據類型以及其關系的。

主要的 Model class 有:

Model Classes
Managed Object Model
NSManagedObjectModel
數據模型
Entity
NSEntityDescription
抽象數據類型,相當于數據庫中的表
Property
NSPropertyDescription
Entity 特性,相當于數據庫表中的一列
  > AttributeNSAttributeDescription
基本數值型屬性(如Int16, BOOL, Date等類型的屬性)
  > Relationship
NSRelationshipDescription
屬性之間的關系
  > Fetched Property
NSFetchedPropertyDescription
查詢屬性(相當于數據庫中的查詢語句)


1)Entity - NSEntityDescription
Entity 相當于數據庫中的一個表,它描述一種抽象數據類型,其對應的類為 NSManagedObject 或其子類。

NSEntityDescription 常用方法:
+insertNewObjectForEntityForName:inManagedObjectContext: 工廠方法,根據給定的 Entity 描述,生成相應的 NSManagedObject 對象,并插入 ManagedObjectContext 中。
-managedObjectClassName 返回映射到 Entity 的 NSManagedObject 類名
-attributesByName 以名字為 key, 返回 Entity 中對應的 Attributes
-relationshipsByName 以名字為 key, 返回 Entity 中對應的 Relationships

2)Property - NSPropertyDescription
Property 為 Entity 的特性,它相當于數據庫表中的一列,或者 XML 文件中的 value-key 對中的 key。它可以描述實體數據(Attribute),Entity之間的關系(RelationShip),或查詢屬性(Fetched Property)。

 > Attribute - NSAttributeDescription
Attribute 存儲基本數據,如 NSString, NSNumber or NSDate 等。它可以有默認值,也可以使用正則表達式或其他條件對其值進行限定。一個屬性可以是 optional 的。
 
 > Relationship - NSRelationshipDescription 
Relationship 描述 Entity,Property 之間的關系,可以是一對一,也可以是一對多的關系。 

 > Fetched Property - NSFetchedPropertyDescription
Fetched Property 根據查詢謂詞返回指定 Entity 的符合條件的數據對象。

上面說的比較抽象,舉個例子來說,見圖:



我們有一個 CocoaDataDemo.xcdatamodeld 模型文件,應用程序根據它生成一個 NSManagedObjectModel 對象,這個模型有三個 Entity,每個 Entity 又可包含 Attribute Relationship, Feteched Property 三種類型的 Property。在本例中, Author Entity 包含兩個Attribute : name 和 email,它們對于的運行時類均為 NSManagedObject;還包含一個與 Post 的 Relationship;沒有設置  Feteched Property。

我們通常使用 KVC 機制來訪問 Property。下面來看代碼:

NSManagedObjectContext * context = [[NSApp delegate] managedObjectContext];
NSManagedObject        * author  = nil;
    
author = [NSEntityDescription insertNewObjectForEntityForName: @"Author" inManagedObjectContext: context];
[author setValue: @"nemo@pixar.com" forKey: @"email"];

NSLog (@"The Author's email is: %@", [author valueForKey:@"email"]);

在上面代碼中,我們先取得 NSManagedObjectContext, 然后調用 NSEntityDescription 的方法,以 Author 為實體模型,生成對應的 NSManagedObject 對象,插入 NSManagedObjectContext 中,然后給這個對象設置特性 email 的值。

 


三,運行時類與對象
> Managed Object - NSManagedObject
Managed Object 表示數據文件中的一條記錄,每一個 Managed Object 在內存中對應 Entity 的一個數據表示。Managed Object 的成員為 Entity 的 Property 所描述。
比如在上面的代碼,author 這個 NSManagedObject,對應名為 Author 的 Entity。

每一個 Managed Object 都有一個全局 ID(類型為:NSManagedObjectID)。Managed Object 會附加到一個 Managed Object Context,我們可以通過這個全局 ID 在 Managed Object Context 查詢對應的 Managed Object。

NSManagedObject 常用方法
-entity
獲取其 Entity
-objectID
獲取其 Managed Object ID
-valueForKey:
獲取指定 Property 的值
-setValue: forKey:
設定指定 Property 的值

> Managed Object Context - NSManagedObjectContext
Managed Object Context 的作用相當重要,對數據對象進行的操作都與它有關。當創建一個數據對象并插入 Managed Object Context 中,Managed Object Context 就開始跟蹤這個數據對象的一切變動,并在合適的時候提供對 undo/redo 的支持,或調用 Persistent Store Coordinato 將變化保存到數據文件中去。

通常我們將 controller 類(如:NSArrayController,NSTreeController)或其子類與 Managed Object Context 綁定,這樣就方便我們動態地生成,獲取數據對象等。

NSManagedObjectContext 常用方法
-save:
將數據對象保存到數據文件
-objectWithID:
查詢指定 Managed Object ID 的數據對象
-deleteObject:
將一個數據對象標記為刪除,但是要等到 Context 提交更改時才真正刪除數據對象
-undo
回滾最后一步操作,這是都 undo/redo 的支持
-lock
加鎖,常用于多線程以及創建事務。同類接口還有:-unlock and -tryLock
-rollback
還原數據文件內容
-reset
清除緩存的 Managed Objects。只應當在添加或刪除 Persistent Stores 時使用
-undoManager
返回當前 Context 所使用的 NSUndoManager
-assignObject: toPersistantStore:
由于 Context 可以管理從不同數據文件而來的數據對象,
這個接口的作用就是指定數據對象的存儲數據文件(通過指定 PersistantStore 實現)
-executeFetchRequest: error:
執行 Fetch Request 并返回所有匹配的數據對象

> Persistent Store Coordinator - NSPersistentStoreCoordinator
使用 Core Data document 類型的應用程序,通常會從磁盤上的數據文中中讀取或存儲數據,這寫底層的讀寫就由 Persistent Store Coordinator 來處理。一般我們無需與它直接打交道來讀寫文件,Managed Object Context 在背后已經為我們調用 Persistent Store Coordinator 做了這部分工作。

NSPersistentStoreCoordinator 常用方法
-addPersistentStoreForURL:configuration:URL:options:error:
裝載數據存儲,對應的卸載數據存儲的接口為 -removePersistentStore:error:
-migratePersistentStore:toURL:options:withType:error:
遷移數據存儲,效果與 "save as"相似,但是操作成功后,
遷移前的數據存儲不可再使用
-managedObjectIDForURIRepresentation:
返回給定 URL所指示的數據存儲的 object id,如果找不到匹配的數據存儲則返回 nil
-persistentStoreForURL:
返回指定路徑的 Persistent Store
-URLForPersistentStore:
返回指定 Persistent Store 的存儲路徑

> Persistent Document - NSPersistentDocument
NSPersistentDocument 是 NSDocument 的子類。 multi-document Core Data 應用程序使用它來簡化對 Core Data 的操作。通常使用 NSPersistentDocument 的默認實現就足夠了,它從 Info.plist 中讀取 Document types 信息來決定數據的存儲格式(xml,sqlite, binary)。

NSPersistentDocument 常用方法
-managedObjectContext
返回文檔的 Managed Object Context,在多文檔應用程序中,每個文檔都有自己的 Context。
-managedObjectModel
返回文檔的 Managed Object Model

四,Fetch Requests
Fetch Requests 相當于一個查詢語句,你必須指定要查詢的 Entity。我們通過 Fetch Requests 向 Managed Object Context 查詢符合條件的數據對象,以 NSArray 形式返回查詢結果,如果我們沒有設置任何查詢條件,則返回該 Entity 的所有數據對象。我們可以使用謂詞來設置查詢條件,通常會將常用的 Fetch Requests 保存到 dictionary 以重復利用。

示例:

NSManagedObjectContext * context  = [[NSApp delegate] managedObjectContext];
NSManagedObjectModel   * model    = [[NSApp delegate] managedObjectModel];
NSDictionary           * entities = [model entitiesByName];
NSEntityDescription    * entity   = [entities valueForKey:@"Post"];

NSPredicate * predicate;
predicate = [NSPredicate predicateWithFormat:@"creationDate > %@", date];
                         
NSSortDescriptor * sort = [[NSortDescriptor alloc] initWithKey:@"title"];
NSArray * sortDescriptors = [NSArray arrayWithObject: sort];

NSFetchRequest * fetch = [[NSFetchRequest alloc] init];
[fetch setEntity: entity];
[fetch setPredicate: predicate];
[fetch setSortDescriptors: sortDescriptors];

NSArray * results = [context executeFetchRequest:fetch error:nil];
[sort release];
[fetch release];

在上面代碼中,我們查詢在指定日期之后創建的 post,并將查詢結果按照 title 排序返回。

 

NSFetchRequest 常用方法
-setEntity:
設置你要查詢的數據對象的類型(Entity)
-setPredicate:
設置查詢條件
-setFetchLimit:
設置最大查詢對象數目
-setSortDescriptors:
設置查詢結果的排序方法
-setAffectedStores:
設置可以在哪些數據存儲中查詢

參考資料:
Core Data Reference API listing for the Core Data classes
http://developer.apple.com/documentation/Cocoa/Reference/CoreData_ObjC/index.html

NSPredicate Reference API listing for NSPredicate
http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSPredicate.html

posted on 2011-09-01 14:14 羅朝輝 閱讀(5863) 評論(0)  編輯 收藏 引用 所屬分類: 移動開發Cocoa 開發
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久综合久久综合久久| 欧美一区二区三区啪啪| 欧美成人免费全部观看天天性色| 亚洲欧洲av一区二区| 国产农村妇女精品一二区| 欧美在线免费| 久久久久久久综合狠狠综合| 亚洲精品乱码久久久久久蜜桃91 | 亚洲精品欧美日韩| 免费观看成人| 一区二区三区免费看| 亚洲午夜精品在线| 国产主播一区二区三区| 欧美mv日韩mv国产网站app| 美女主播视频一区| 一二美女精品欧洲| 欧美亚洲一区二区在线| ●精品国产综合乱码久久久久 | 日韩视频中文字幕| 亚洲欧美www| 亚洲国产精品一区二区第一页 | 亚洲电影免费在线观看| 欧美日本高清| 久久综合中文| 国产精品高潮在线| 美日韩免费视频| 欧美三级视频在线| 久久综合五月| 欧美三级视频在线播放| 久热精品视频在线观看| 欧美日韩不卡| 媚黑女一区二区| 国产精品视频自拍| 亚洲国产精品久久久久久女王| 国产精品一区二区久久国产| 欧美激情1区| 国产伦精品一区二区三区视频孕妇 | 国内精品视频在线播放| 亚洲美女免费精品视频在线观看| 国产亚洲精品久久久久久| 亚洲日本黄色| 最近看过的日韩成人| 校园春色国产精品| 亚洲欧美日韩一区二区三区在线观看| 另类天堂av| 男女视频一区二区| 国产真实久久| 亚洲欧美一区二区激情| 亚洲综合久久久久| 欧美日韩亚洲视频| 亚洲国产人成综合网站| 亚洲国产日韩欧美在线图片| 午夜一级在线看亚洲| 欧美伊人久久大香线蕉综合69| 欧美日韩高清在线播放| 亚洲国内高清视频| 亚洲人成人一区二区三区| 久久婷婷久久| 玖玖玖免费嫩草在线影院一区| 国产视频观看一区| 香蕉久久夜色精品国产| 欧美在线视频免费观看| 国产精品入口| 欧美亚洲视频在线看网址| 欧美一区二区三区免费视| 国产精品视频区| 亚洲综合色婷婷| 久久se精品一区二区| 国产亚洲精品久久久| 欧美日韩直播| 亚洲一区三区电影在线观看| 欧美激情2020午夜免费观看| 亚洲国产精品嫩草影院| 亚洲精品在线电影| 欧美日韩精品在线| 中文精品视频| 久久久久久久欧美精品| 亚洲高清电影| 欧美另类视频| 亚洲综合精品四区| 老司机午夜精品视频| 在线看片欧美| 欧美日韩你懂的| 亚洲一区二区三区乱码aⅴ蜜桃女| 香蕉久久精品日日躁夜夜躁| 国产欧美在线看| 久久久欧美一区二区| 亚洲国产天堂久久综合| 亚洲欧美日本伦理| 狠狠色综合色区| 欧美精品在欧美一区二区少妇| 99精品久久免费看蜜臀剧情介绍| 欧美一区二区三区久久精品茉莉花| 国产一区再线| 欧美人妖另类| 久久国产88| 亚洲精品久久久蜜桃| 先锋影音久久| 亚洲人成人77777线观看| 国产精品成人免费精品自在线观看| 校园春色国产精品| 亚洲国产高清一区二区三区| 亚洲男人第一av网站| 一色屋精品视频在线观看网站| 欧美日本一区| 欧美在线视频在线播放完整版免费观看| 欧美成人综合| 久久精品91久久香蕉加勒比 | 欧美精品在线观看播放| 午夜精品一区二区三区在线| 欧美韩国日本一区| 先锋影院在线亚洲| 亚洲蜜桃精久久久久久久| 国产一区日韩二区欧美三区| 欧美日韩一区二区三区在线看 | 欧美视频免费看| 免费成人毛片| 久久av最新网址| 亚洲天堂偷拍| 日韩网站在线观看| 欧美α欧美αv大片| 久久久久国产精品麻豆ai换脸| 国产精品99久久久久久久久 | 欧美三级特黄| 欧美国产丝袜视频| 乱中年女人伦av一区二区| 亚洲欧美在线一区| 一区二区三区日韩| 亚洲精品久久嫩草网站秘色| 欧美成人资源| 美女久久网站| 久久精品视频在线看| 午夜久久久久久| 午夜精品福利一区二区蜜股av| 一本一本大道香蕉久在线精品| 亚洲精品综合| 欧美大胆人体视频| 欧美精品久久久久久久| 亚洲丰满在线| 免费久久99精品国产自在现线| 久久久久高清| 久久欧美肥婆一二区| 久久深夜福利免费观看| 久久久久国产精品厨房| 久久精品成人| 久久九九精品| 久久亚洲精品中文字幕冲田杏梨| 久久精品亚洲乱码伦伦中文 | 国产亚洲视频在线| 国产欧美日本一区二区三区| 国产精品女主播| 国产精品无码专区在线观看| 国产精品综合| 国外成人在线| 亚洲黄色在线| 国产精品99久久久久久久女警| 亚洲视频视频在线| 欧美一区二区三区四区高清| 久久9热精品视频| 久久夜色精品一区| 牛牛国产精品| 日韩西西人体444www| 亚洲天堂av电影| 久久九九全国免费精品观看| 欧美国产综合| 国产精品视频久久| 一区二区亚洲| 一区二区不卡在线视频 午夜欧美不卡'| 亚洲亚洲精品三区日韩精品在线视频| 欧美一区二区国产| 欧美a级片网| 一二三区精品福利视频| 先锋影音久久久| 女人色偷偷aa久久天堂| 欧美日韩国产大片| 国内一区二区三区| 99国产精品私拍| 久久精品国产77777蜜臀| 欧美高清自拍一区| 亚洲视频在线播放| 久久亚洲春色中文字幕| 国产精品久久久久久一区二区三区| 黄色工厂这里只有精品| 亚洲一二三级电影| 蜜臀99久久精品久久久久久软件| 日韩视频永久免费观看| 久久理论片午夜琪琪电影网| 国产精品久久久久久久久动漫 | 国产精品萝li| 91久久国产自产拍夜夜嗨| 香蕉久久精品日日躁夜夜躁| 亚洲第一网站| 欧美资源在线观看| 欧美视频在线不卡| 亚洲人成网站在线播| 久久精品一区二区三区四区| 一区二区三区四区精品| 欧美成人蜜桃| 亚洲国产电影| 免费观看日韩av|