胖子汪洋的博客

一只超级简单的喵星转世人

iOS Core Data 入门

| Comments

做了一年多iOS开发,真没怎么用过Core Data,来新公司一直没有活,就看Core Data了。网上一搜一大把关于Core Data的教程,我以我自己的方式重新再说一次,如看不懂就再自己搜索吧。

注意

Core Data不是数据库,只是对SQLite的封装,集成了很多内容,并且高效。

开始

我新建了一个类,SQLManager : NSObject

添加了一个类方法,目的是全局使用一个SQLManager对象

1
2
3
4
5
6
7
8
9
10
+ (SQLManager *)sharedSQLManager
{
    static dispatch_once_t onceToken;
    static id shareInstance;
    dispatch_once(&onceToken, ^{
        shareInstance = [[self alloc] init];
    });

    return shareInstance;
}

Core Data涉及三个对象是肯定每次都要用的的

1
2
3
@property (nonatomic, strong) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator;

使用一个initCoreData来初始化这三个对象(SQLManager的属性)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
- (void)initCoreData
{
    // 既然涉及数据库,肯定要有一个文件来存储数据
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = [paths objectAtIndex:0];
    NSURL *storeUrl = [NSURL fileURLWithPath:[basePath stringByAppendingPathComponent:@"TestDB.sqlite"]];

    /* 初始化 managedObjectModel 
     * managedObjectModel 的初始化是依据工程中的xcdatamodeld文件,
     */
    _managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];

    /* 初始化 persistentStoreCoordinator
     * persistentStoreCoordinator 的初始化需要刚才的 managedObjectModel,这里我添加了一个option,该option会在数据库的版本控制及轻量迁移中用到。
     * 数据库的版本控制及轻量迁移见另一篇文章: iOS Core Data Version
     */
    NSError *error;
    // option use for lightweight migration
    NSDictionary * option = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:_managedObjectModel];
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:option error:&error]) {
        NSLog(@"%@: %@", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"], error.localizedDescription);
    }

    /* 初始化 managedObjectContext
     * managedObjectContext 的初始化需要上面的 persistentStoreCoordinator
     */
    _managedObjectContext = [[NSManagedObjectContext alloc] init];
    _managedObjectContext.persistentStoreCoordinator = _persistentStoreCoordinator;
}

参考文档:

  • Core Data Basics
  • Core Data Programming Gudie
  • google及baidu的各种搜索

Comments