over 5 years ago

Core Data是Cocoa中非常强大的存取数据的Framework,Apple对Core Data提供了详细的介绍,在新建项目的过程中,通常只要勾选Using Core Data就能在项目中使用了。这很方便,但是也造成了很多人不知道如何自己从头开始使用Core Data。但是其实从头开始添加Core Data挺简单的。

添加Core Data Framework

首先需要把Framework引入项目,添加coredata.framework,然后引入头文件。在你的 projectname-Prefix.pch 文件中,添加

#import <CoreData/CoreData.h>

添加三个重要的属性

1. NSManagedObjectModel *managedObjectModel
2. NSPersistentStoreCoordinator *persistentStoreCoordinator
3. NSManagedObjectContext *managedObjectContext

这三个属性通常都应该是只读的,可以通过Get方法来初始化这三个属性。第一个当然是PersistentStore,

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    NSFileManager *sharedFM = [NSFileManager defaultManager];
    NSArray *availableURLs = [sharedFM URLsForDirectory:NSApplicationSupportDirectory               inDomains:NSUserDomainMask];

    NSURL *appSupportDir = nil;
    NSURL *appDirectory = nil;

    if (availableURLs.count > 0) {
        appSupportDir = [availableURLs objectAtIndex:0];
    }

    if (appSupportDir) {
        NSString *appBundleId = [[NSBundle mainBundle] bundleIdentifier];
        appDirectory = [appSupportDir URLByAppendingPathComponent:appBundleId];
    }

    if (![sharedFM fileExistsAtPath:appDirectory.absoluteString]) {
        [sharedFM createDirectoryAtPath:appDirectory.absoluteString
            withIntermediateDirectories:YES 
                             attributes:nil 
                                  error:nil];
    }
    NSURL *storeUrl = [NSURL fileURLWithPath: [appDirectory.absoluteString
                                   stringByAppendingPathComponent:@"iweibo4mac.sqlite"]];   
    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
                               initWithManagedObjectModel:[self managedObjectModel]];
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                               configuration:nil URL:storeUrl options:nil           error:&error]){
        //Replace this implementation with code to handle the error appropriately.

        NSDictionary *ui = [error userInfo];
        for(NSString *err in [ui keyEnumerator]) {
            NSLog(@"err:%@",[ui objectForKey:err]);
        }
        abort();
    }
    return _persistentStoreCoordinator;
}

其中文件的存放路径根据不同的文件类型,应该存放的不同的地方。

然后是managedObjectModel,

- (NSManagedObjectModel *)managedObjectModel {
    if (_managedObjectModel != nil) {
        return _managedObjectModel;
    }
    _managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
    return _managedObjectModel;
}

mergedModelFromBundles:会把项目中所有的datamodel文件都读取进来初始化,而initWithContentsOfURL:会根据指定的datamodel文件来初始化。

再就是managedObjectContext,

- (NSManagedObjectContext *) managedObjectContext {
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        _managedObjectContext = [[NSManagedObjectContext alloc] init];
        [_managedObjectContext setPersistentStoreCoordinator: coordinator];
    }
    return _managedObjectContext;
}

有了managedObjectContext,Core Data就Ready了!

← Cocoa解析新浪微博的日期 Fuck You, 上海出入境管理局 →