標籤:事務 執行個體化 void str code nts file res 添加
標頭檔:
1 #import <Foundation/Foundation.h> 2 #import <CoreData/CoreData.h> 3 4 /** 5 CoreData管理器 6 */ 7 @interface CoreDataManager : NSObject 8 9 + (instancetype)sharedManager;10 11 /**12 持久化容器 - 可以提供管理上下文 iOS 10 推出13 包含了 Core Data stack 中所有的核心對象,都不是安全執行緒的14 15 - NSManagedObjectContext *viewContext; 管理上下文16 - NSManagedObjectModel *managedObjectModel;17 - NSPersistentStoreCoordinator *persistentStoreCoordinator;18 */19 //@property (readonly, strong) NSPersistentContainer *persistentContainer;20 21 /**22 管理物件內容23 */24 @property (readonly, strong) NSManagedObjectContext *moc;25 26 /**27 儲存上下文28 */29 - (void)saveContext;30 31 @end
.m檔案:
1 #import "CoreDataManager.h" 2 3 @implementation CoreDataManager 4 5 + (instancetype)sharedManager { 6 static id instance; 7 static dispatch_once_t onceToken; 8 dispatch_once(&onceToken, ^{ 9 instance = [self new];10 });11 return instance;12 }13 14 #pragma mark - Core Data stack15 // 如果重寫了唯讀屬性的 getter 方法,編譯器不再提供 _成員變數16 @synthesize moc = _moc;17 18 /**19 為了低版本的相容20 */21 - (NSManagedObjectContext *)moc {22 23 if (_moc != nil) {24 return _moc;25 }26 27 // 互斥鎖,應該鎖定的代碼盡量少!28 @synchronized (self) {29 30 // 1. 執行個體化管理上下文31 _moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];32 33 // 2. 管理物件模型(實體)34 NSManagedObjectModel *mom = [NSManagedObjectModel mergedModelFromBundles:nil];35 36 // 3. 持久化儲存調度器37 NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];38 39 // 4. 添加資料庫40 /**41 1> 資料存放區類型42 3> 儲存 SQLite 資料庫檔案的 URL43 4> 設定資料庫選項44 */45 NSString *cacheDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;46 NSString *path = [cacheDir stringByAppendingPathComponent:@"ys.db"];47 // 將本地檔案的完整路徑轉換成 檔案 URL48 NSURL *url = [NSURL fileURLWithPath:path];49 50 NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption: @(YES),51 NSInferMappingModelAutomaticallyOption: @(YES)};52 53 [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:options error:NULL];54 55 // 5. 給管理上下文指定儲存調度器56 _moc.persistentStoreCoordinator = psc;57 }58 59 return _moc;60 }61 62 #pragma mark - Core Data Saving support63 - (void)saveContext {64 NSManagedObjectContext *context = self.moc;65 66 // 判斷上下文中是否有資料發生變化67 // `事務` 可以儲存多個資料,不一定每次資料變化都需要儲存,例如:for 增加多條記錄,就可以最後調用一次儲存操作即可!68 if (![context hasChanges]) {69 return;70 }71 72 // 儲存資料73 NSError *error = nil;74 75 if (![context save:&error]) {76 NSLog(@"儲存資料出錯 %@, %@", error, error.userInfo);77 }78 }79 80 @end
CoreDataManager-OC版-相容iOS10以前的版本