CoreData提供了一種簡便的對象持久化管理方法,使你可以不用關心數據的存儲,只需要關心對象的增加、刪除、更改、讀寫。
基本概念
托管對象(managed object)
一個托管對象代表你想要保存到數據存儲中的一個對象。這在概念上類似於SQL中的一條記錄, 並且通常也包含一些域,這些域對應於你想要保存的對象的屬性。
數據存儲(data store)
Core Data支持4中類型的數據存儲:SQLiteStore, XMLStore, BinaryStore, InMemoryStore。
托管對象上下文(managed object context)
托管對象上下文類似於應用程序和數據存儲之間的一塊緩沖區。這塊緩沖區包含所有未被寫入數據存儲的托管對象。你可以添加、刪除、更改緩沖區內的托管對象。在很多時候,當你需要讀、插入、刪除對象時,你將會調用托管對象上下文的方法。
持久化存儲協調器(persistent store coordinator)
持久化存儲協調器處理到數據存儲的連接,並且包含一些底層信息,像用到數據存儲的名字和位置。這個類通常被托管對象上下文用到。
托管對象模型(managed object model)
托管對象模型是一個類,這個類包含每一個你想存儲到數據存儲中的托管對象的定義。
大概是這樣一種層次關系:
大概是這樣一種層次關系:
使用CoreData
1 在你可以讀或寫模型對象到當前數據存儲之前,你需要實例化托管對象模型、托管對象上下文、持久化存儲協調器。
托管對象模型由NSManagedObjectModel類的一個實例表示。在一個工程中我們只需要為所有的.xcdatamodeld文件實例化一個對象。
NSManagedObjectModel* managedObjectModel = [NSManagedObjectModel
mergedModelFromBundles:nil];
mergedModelFromBundles: 搜索工程中所有的.xcdatamodeld文件,並加載所有的實體到一個NSManagedObjectModel 實例中。
這樣托管對象模型知道所有當前工程中用到的托管對象的定義
2 有了托管對象模型實例之后,我們就可以創建一個持久化協調器實例了。持久化協調器處理到數據存儲的連接。大概是處理怎么把對象寫到數據存儲或怎么從數據存儲讀對象吧。
3 有了持久化協調器實例之后,我們需要提供一個數據存儲給它管理。你可以通過發送addPersistentStoreWithType:configuration:URL:options:error:消息來實現。
4 最后一步就是實例化托管對象上下文。有了托管對象上下文,你就可以方便的管理對象了。
下面是使用的實例代碼:
1 初始化
-(void) viewDidLoad中
//創建管理對象模型 objectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; // 創建持久化數據存儲協調器 coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:objectModel]; // 添加數據存儲 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); // 創建一個SQLite數據庫作為數據存儲 NSString *documentsDir = [paths objectAtIndex:0]; NSString *filePath = [documentsDir stringByAppendingPathComponent:@"datastore.sqlite"]; NSURL *databaseURL = [NSURL fileURLWithPath:filePath]; NSError *error = nil; [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:databaseURL options:nil error:&error]; // 創建托管對象上下文 objectContext = [[NSManagedObjectContext alloc] init]; [objectContext setPersistentStoreCoordinator:coordinator];
2 添加對象
NSString* newName = nameField.text; NSString* newPhone = phoneField.text; NSString* newPostcode = postcodeField.text; ContactData *newContact = (ContactData *)[NSEntityDescription insertNewObjectForEntityForName:@"ContactData" inManagedObjectContext:objectContext]; newContact.customerName = newName; newContact.phoneNumber = newPhone; newContact.postCode = newPostcode; NSError* error; if ([objectContext save:&error]) { [self fetchExistingContactData]; [tableofcontacts reloadData]; }
3 訪問對象
NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription* entityDescription = [NSEntityDescription entityForName:@"ContactData" inManagedObjectContext:objectContext]; [fetchRequest setEntity:entityDescription]; NSError* error; existingContacts = [objectContext executeFetchRequest:fetchRequest error:&error];
參考:http://www.cocoachina.com/iphonedev/sdk/2010/1126/2397.html
http://linwwwei.iteye.com/blog/1296030