1.前文
上次用SQLite3實現了數據管理,這次准備用CoreData來實現。
Core Data 是iOS SDK 裡的一個很強大的框架,允許程序員以面向對象的方式儲存和管理數據。使用Core Data框架,程序員可以很輕松有效地通過面向對象的接口管理數據
相比SQLite3來說,用CoreData更有利於程序員來管理數據,
除了開頭的准備工作略微繁瑣點,後面的操作都很方便。
而且在CoreData在數據操作過程中,無需編寫任何SQL語句,這一點和JAVA裡的hibernate框架類似。
那麼,下面我就直接說說它的實現步驟。
2.CoreData實現的主要步驟
2.1.要使用Core Data,首先需要導入CoreData框架
表結構:NSEntityDescription
表記錄:NSManagedObject
數據庫存放方式:NSPersistentStoreCoordinator(持久化存儲協調者)
數據庫操作:NSManagedObjectContext(被管理的對象上下文)
2.2.接著要使用Code Data,首先需要定義模型文件,描述應用程序中的所有實體(Entities)
2.3.創建連接數據庫
首先需要創建一個操作數據庫的上下文。NSManagedObjectContext
操作數據庫的上下文需要設置一個調度者屬性,這個調度者是用來將圖形化建立的模型和數據庫聯系起來。
給調度者添加一個需要聯系的數據庫。
1 // Merging合並可以將圖形化建立的所有Model匯總到一個數據庫文件中
2 NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
3
4 // 調度者的實例化,需要Model
5 NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
6
7 // 數據庫是一個文件,持久化連接的文件
8 NSError *error = nil;
9 NSURL *url = [@"my.db" appendDocumentDirURL];
10
11 // 添加持久化存儲的數據庫
12 [store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error];
13
14 if (error == nil) {
15 NSLog(@"數據庫建立成功");
16
17 // 獲取到數據庫操作的上下文,類似於SQLite的句柄
18 _sharedContext = [[NSManagedObjectContext alloc] init];
19
20 // 讓上下文記錄住存儲調度
21 _sharedContext.persistentStoreCoordinator = store;
22 } else {
23 NSLog(@"數據庫建立失敗");
24 }
2.4.添加,更新,刪除
添加:
1.新建實體 INST (插入)
1 Person *p = [[Person alloc] init]
2.設置實體的屬性
1 // 設置對象內容
2 person.name = _nameText.text;
3 person.phoneNo = _phoneText.text;
4 person.qq = _qqText.text;
5 person.weibo = _weiboText.text;
3.保存上下文
1 //實體描述
2 [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context]
3
4 // 獲取上下文
5 NSManagedObjectContext *context = [[DataManager sharedDataManager] sharedContext];
6
7 // 讓上下文保存
8 if ([context save:nil]) {
9 NSLog(@"保存成功");
10
11 // 返回上級視圖控制器
12 [self.navigationController popViewControllerAnimated:YES];
13 } else {
14 NSLog(@"保存失敗!");
15 }
更新:
1.判斷是否已有一模一樣的模型
//判斷
Person *person = _editPerson;
// 如果person == nil表示是新建用戶
if (person == nil) {
person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
}
2.設置實體屬性
person.name = _nameText.text;
person.phoneNo = _phoneText.text;
person.qq = _qqText.text;
person.weibo = _weiboText.text;
3.保存上下文
1 // 讓上下文保存
2 if ([context save:nil]) {
3 NSLog(@"保存成功");
4
5 // 返回上級視圖控制器
6 [self.navigationController popViewControllerAnimated:YES];
7 } else {
8 NSLog(@"保存失敗!");
9 }
刪除
// 1. 首先找到要刪除哪條記錄
Person *person =
1 // 2. 刪除
2 NSManagedObjectContext *context = [[DataManager sharedDataManager] sharedContext];
3
4 // 讓上下文刪除
5 [context deleteObject:person];
6
7 // 上下文保存
8 if ([context save:nil]) {
9 NSLog(@"刪除成功!");
10 } else {
11 NSLog(@"刪除失敗!");
12 }
2.4.查詢
三.查詢
1.使用NSFetchedResultsController控制器
// 查詢結果控制器
NSFetchedResultsController *_fetchedResultsController;
2.監控managed object context對象的改變,報告給delegate
1 // 設置代理
2 _fetchedResultsController.delegate = self;
2.1當操作數據上下文的內容改變的時候,會自動調用抓取結果控制器的代理方法
1 #pragma mark 查詢結果控制器代理方法
2 - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
3 {
4 // 新增、修改、刪除
5 [self.tableView reloadData];
6 }
3.創建控制器
一般來說,你會創建一個NSFetchedResultsController實例作為tableview的成員變量。初始化的時候,你提供四個參數:
1。 一個fetchrequest.必須包含一個sortdescriptor用來給結果集排序。
2。 一個managedobject context。 控制器用這個context來執行取數據的請求。
3。 一個可選的keypath作為sectionname。控制器用keypath來把結果集拆分成各個section。(傳nil代表只有一個section)
4。 一個cachefile的名字,用來緩沖數據,生成section和索引信息。
1 NSFetchRequest *reqest = _fetchedResultsController.fetchRequest;
1 1> 查詢請求
2 2> 數據庫上下文
3 3> 表格中用於分組的字段名
4 4> 緩存名稱
5 */
6 _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];
5.注意:一定要執行抓取請求,返回的數據在sections裡,這個數組中裝的都是遵守NSFetchedResultsSectionInfo這個協議的對象。通過numberOfObjects就能獲取一組有多少數據對象了。
1 return [_fetchedResultsController.sections[0] numberOfObject