Core Data

先推薦一個寫得不錯的關於Core Data的文章:http://blog.csdn.net/q199109106q/article/details/8563438

還有:http://my.oschina.net/pljhonglu/blog/199668#OSC_h3_4

還有:http://my.oschina.net/jackyyang/blog/66641

先提出兩個問題吧;

1.什麼是Core Data?

2.Core Data的原理和整個處理過程是什麼?



1.什麼是Core Data?

Core Data是一個框架,是一個提供對象-關係映射功能的框架,Core Data能夠將OC對象轉化成數據,以保存在SQLite數據庫文件中,也可以將保存後的數據還原成Object-c對象。使用Core Data無需瞭解SQL就能讀取和保存關係數據庫中的數據。

2.Core Data的原理和整個處理過程是什麼?

Core Data有幾個重要的類:
1.NSManagedObjectContext:負責應用和數據庫之間的交互,及聯繫數據庫和對象。
2.NSPersistentStoreCoordinator:可以指定文件路徑並打開相應的SQLite數據庫,該對象需要一個NSManagedObjectModel實例。
3.NSManagedObjectModel:代表某個Core Data模型文件,即要進行保存的數據。(用XCODE提供的模板界面建立模型文件較爲方便)
4.NSEntityDescription:實體描述。
5.NSManagedObject:通過Core Data取回的對象,默認情況下都是NSManagedObject實例,我們可以通過Core Data創建一個新類,該類繼承自NSManagedObject,(用Core Data模板創建)。
整個過程如下圖:

代碼如下:

- (id)init
{
    if (defaultStore) {
        return defaultStore;
    }
    
    self = [super init];
//    if (self) {
//        allPossessions = [[NSMutableArray alloc] init];
//    }
    
    //讀入Homepwner.xcdatamodeld這是通過模型文件建立的
    model = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
    NSLog(@"model= %@",model);
    
    NSPersistentStoreCoordinator *persisStoreCordor = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
    
    //設置SQLite文件路徑
    NSString *path = pathInDocumentDirectory(@"store.data");
    NSURL *storeURL = [NSURL fileURLWithPath:path];
    
    NSError *error = nil;
    if (![persisStoreCordor addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
        [NSException raise:@"Open failed" format:@"Reason: %@",[error localizedDescription]];
    }
    
    //創建NSManagedObjectContext對象
    context = [[NSManagedObjectContext alloc] init];
    [context setPersistentStoreCoordinator:persisStoreCordor];
    [persisStoreCordor release];
    
    //NSManagedObjectContext對象可以管理撤銷(undo)操作,Homepwner不需要該功能
    [context setUndoManager:nil];
    
    return self;
}

- (BOOL)saveChanges {
    //return [NSKeyedArchiver archiveRootObject:allPossessions toFile:[self possessionArchivePath]];
    NSError *err = nil;
    BOOL successful = [context save:&err];//保存數據
    if (!successful) {
        NSLog(@"Error saving: %@",[err localizedDescription]);
    }
    return successful;
}

還有一個比較常用的類:NSFetchRequest,當項目要使用Possession(一個存放數據的類)時,要一次性的取出store.data中的全部Possession,要通過NSManagedObjectContext實例得到這些對象,就必須設置並執行NSFetchRequest對象,執行NSFetchRequest對象後,可以得到一組與響應(NSFetchRequest對象的)參數匹配的對象。執行NSFetchRequest對象前,先要設置實體描述,定義所要獲取對象的實體,此外,還可以設置NSFetchRequest對象的排序描述對象,用於指定返回對象的次序。如果數據龐大,還可以按需獲取實體實例,通過爲NSFetchRequest對象增加NSPredicate對象,可以只返回符合條件的對象。(具體參見官方開發文檔《Predicate Programming Guide》)
代碼:
- (void)fetchPossessionIfNecessary {

    if (!allPossessions) {
        NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
        
        NSEntityDescription *entity = [[model entitiesByName] objectForKey:@"Possession"];
        [request setEntity:entity];
        
        NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"orderingValue" ascending:YES];
        [request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
        
        NSError *error;
        NSArray *result = [context executeFetchRequest:request error:&error];
        if (!result) {
            [NSException raise:@"Fetch failed" format:@"Reason: %@",[error localizedDescription]];
        }
        
        allPossessions = [[NSMutableArray alloc] initWithArray:result];
    }
}


發佈了48 篇原創文章 · 獲贊 8 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章