Core Data淺談係列之二 : 簡單的CURD
在上一篇中簡單介紹了Core Data Stack,自上而下地對Core Data應用結構有個基本的認識,不過都是理論上的。這裏就以上一篇的理論構建起一個可運行的Demo,執行一些簡單的增刪改查操作。

(圖片來自Apple)
首先,我們需要建立如上圖的棧結構。因此,在ViewController裏添加3個屬性:
@interface ViewController : UIViewController @property (nonatomic, retain) NSManagedObjectModel *managedObjectModel; @property (nonatomic, retain) NSManagedObjectContext *managedObjectContext; @property (nonatomic, retain) NSPersistentStoreCoordinator *persistentStoreCoordinator; @end
根據前文討論的順序,我們首先創建managedObjectModel(在那之前需要引入CoreData Framework):
- (NSManagedObjectModel *)managedObjectModel { if (nil != _managedObjectModel) { return _managedObjectModel; } _managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; return _managedObjectModel; }
接著創建NSManagedObject的生存環境 —— NSManagedObjectContext:
- (NSManagedObjectContext *)managedObjectContext { if (nil != _managedObjectContext) { return _managedObjectContext; } _managedObjectContext = [[NSManagedObjectContext alloc] init]; return _managedObjectContext; }
由於Demo會將數據存儲到本地文件,所以還需要NSPersistentStoreCoordinator和NSManagedObjectContext配合。
下麵是創建Core Data棧結構的完整代碼:
#pragma mark - #pragma mark - Core Data Stack - (NSManagedObjectModel *)managedObjectModel { if (nil != _managedObjectModel) { return _managedObjectModel; } _managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; return _managedObjectModel; } - (NSManagedObjectContext *)managedObjectContext { if (nil != _managedObjectContext) { return _managedObjectContext; } _managedObjectContext = [[NSManagedObjectContext alloc] init]; if (self.persistentStoreCoordinator) { [_managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator]; } return _managedObjectContext; } - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (nil != _persistentStoreCoordinator) { return _persistentStoreCoordinator; } NSString *storeType = NSSQLiteStoreType; NSString *storeName = @"cdNBA.sqlite"; NSError *error = NULL; NSURL *storeURL = [NSURL fileURLWithPath:[[self applicationDocumentsDirectory] stringByAppendingPathComponent:storeName]]; _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel]; if (![_persistentStoreCoordinator addPersistentStoreWithType:storeType configuration:nilURL:storeURL options:nil error:&error]) { NSLog(@"Error : %@\n", [error localizedDescription]); NSAssert1(YES, @"Failed to create store %@ with NSSQLiteStoreType", [storeURL path]); } return _persistentStoreCoordinator; } #pragma mark - #pragma mark Application's Documents Directory - (NSString *)applicationDocumentsDirectory { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; return basePath; }
在搭建完基礎的Core Data棧結構後,就可以寫一些簡單的CURD代碼了:
#pragma mark - #pragma mark - CURD Operations - (BOOL)createTeamWithName:(NSString *)teamName city:(NSString *)teamCity { if (!teamName || !teamCity) { return NO; } NSManagedObject *teamObject = [NSEntityDescription insertNewObjectForEntityForName:@"Team" inManagedObjectContext:self.managedObjectContext]; [teamObject setValue:teamName forKey:@"name"]; [teamObject setValue:teamCity forKey:@"city"]; return YES; } - (NSArray *)fetchTeamList { NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; [fetchRequest setEntity:[NSEntityDescription entityForName:@"Team" inManagedObjectContext:self.managedObjectContext]]; NSError *error = NULL; NSArray *array = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; if (error) { NSLog(@"Error : %@\n", [error localizedDescription]); } [fetchRequest release], fetchRequest = nil; return array; }
我們可以把讀寫的代碼放到viewDidLoad函數中:
- (void)viewDidLoad { [superviewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self createTeamWithName:@"Heat"city:@"Miami"]; [self createTeamWithName:@"Lakers"city:@"LA"]; [self saveContext]; NSArray *teamArray = [self fetchTeamList]; if (teamArray) { for (NSManagedObject *teamObject in teamArray) { NSString *teamName = [teamObject valueForKey:@"name"]; NSString *teamCity = [teamObject valueForKey:@"city"]; NSLog(@"Team info : %@, %@\n", teamName, teamCity); } } }
由於在context中創建的對象隻是存在於內存中,所以我們還需要顯式地把數據保存到sqlite文件裏:
#pragma mark - #pragma mark - Save Context - (void)saveContext { NSError *error = NULL; NSManagedObjectContext *moc = self.managedObjectContext; if (moc && [moc hasChanges] && ![moc save:&error]) { NSLog(@"Error %@, %@", error, [error localizedDescription]); abort(); } }
最後,就是跑一下Demo,檢驗一下結果。
執行過一次程序後,我們可以搜索下cdNBA.sqlite文件,然後查看裏麵的數據:

同時,控製台也輸出了數據:
2013-01-16 14:32:52.638 cdNBA[4717:c07] Team info : Heat, Miami 2013-01-16 14:32:52.639 cdNBA[4717:c07] Team info : Lakers, LA
Brief Talk About Core Data Series, Part 2 : Simple CURD
最後更新:2017-04-04 07:03:38