上次用SQLite3實現了數據管理,這次準備用CoreData來實現。
Core Data 是iOS SDK 里的一個很強大的框架,允許程序員以面向對象的方式儲存和管理數據。使用Core Data框架,程序員可以很輕松有效地通過面向對象的接口管理數據
相比SQLite3來說,用CoreData更有利于程序員來管理數據,
除了開頭的準備工作略微繁瑣點,后面的操作都很方便。
而且在CoreData在數據操作過程中,無需編寫任何SQL語句,這一點和java里的hibernate框架類似。
那么,下面我就直接說說它的實現步驟。
表結構:NSEntityDescription
表記錄:NSManagedObject
數據庫存放方式:NSPersistentStoreCoordinator(持久化存儲協調者)
數據庫操作: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 }
添加:
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 }
1.使用NSFetchedResultsController控制器
// 查詢結果控制器 NSFetchedResultsController *_fetchedResultsController;
2.監控managed object context對象的改變,報告給delegate
1 // 設置代理2 _fetchedResultsController.delegate = self;
2.1當操作數據上下文的內容改變的時候,會自動調用抓取結果控制器的代理方法
1 #PRagma mark 查詢結果控制器代理方法2 - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller3 {4 // 新增、修改、刪除5 [self.tableView reloadData];6 }
3.創建控制器
一般來說,你會創建一個NSFetchedResultsController實例作為tableview的成員變量。初始化的時候,你提供四個參數:
1。 一個fetchrequest.必須包含一個sortdescriptor用來給結果集排序。
2。 一個managedobject context。 控制器用這個context來執行取數據的請求。
3。 一個可選的keypath作為sectionname??刂破饔胟eypath來把結果集拆分成各個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] numberOfObjects];
清澈Saup
新聞熱點
疑難解答