CoreData


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 有了托管對象模型實例之后,我們就可以創建一個持久化協調器實例了。持久化協調器處理到數據存儲的連接。大概是處理怎么把對象寫到數據存儲或怎么從數據存儲讀對象吧。

有了持久化協調器實例之后,我們需要提供一個數據存儲給它管理。你可以通過發送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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM