標籤:des style blog java color 使用
iOS中大量資料的儲存一個是SqLite,另一個就是CoreData,CoreData允許程式員以物件導向的思維方式的方法去操作面向表的資料庫
做過Java開發的對這個應該很熟悉,Java中的Hibernate跟CoreData就很相似
CoreData應該怎樣使用呢?
第一步,建立工程後匯入CoreData架構
第二部,建立CoreData的資料模型建立步驟如下
然後給你的model起個名字,建立完成後你會看到一個這個檔案(相當於資料庫檔案)
點擊這個檔案,然後看
點擊圖中1,建立實體(類似於資料局庫中的表),,,然後再圖中2位置給你的實體命名,,然後再圖中三位置,給你的實體添加欄位(類似於資料庫中的列名)
前面只是建立了資料庫裡面的表,要通過類對象動作表,還需要有與之對應的對象
接下來就建立與之對應的對象,建立CoreData對象跟平常我們自己建立NSObject對象不同,CoreData對象是由工具建立的;見
按照圖中的方式,一路next,之後你會發現,你的分類樹中對了兩個檔案,名字與你的實體名相同
至此就完成了使用CoreData的基本工具上的工作,下面我們就開始寫代碼了
要在代碼裡跟操作CoreData檔案,需要一個內容物件(類似於sql中的控制代碼)
NSManagedObjectContext *sharedContext;
我們剛才建立哪些CoreData用的檔案時,程式運行,APP會在MainBundle裡建立一些檔案,而這些檔案就對應著建立的模型
,要操作一個或多個模型,需要用代碼把這些檔案合并起來,下面是合并的代碼
NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
然後資料檔案表和對象建立關係需要一個中心調度者,
中心調度這可以建立起資料庫和對象以及模型檔案之間的對應關係
對應代碼如下
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model]; [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:path] options:nil error:nil]; _sharedContext = [[NSManagedObjectContext alloc] init]; _sharedContext.persistentStoreCoordinator = coordinator;
到此為止我們就可以很HAPPy的使用上下文操作對象和資料庫之間的關係了
首先來看怎麼向資料庫中插入一個對象資料
因為要使對象跟資料庫建立儲存關係,所以建立對象時不要用以前的alloc 和init來建立了
要使用工具提供的方法,這樣系統才知道對象和資料庫的聯絡
Person *per = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:[DataManager sharedDataManager].sharedContext]; per.name = @"jing"; per.phoneNo = @"123123123"; if([_sharedContext save:nil]){ NSLog(@"yes"); }else{ NSLog(@"no"); }
這樣就可以將per對象存入到資料庫中
下面就看看怎麼去取資料
CoreData裡取資料是就是去資料庫裡面查詢資料,然後將資料返回來,因此我們需要一個查詢結果控制器(非視圖控制器)
NSFetchedResultsController *_fetchedResultsController;
執行查詢的代碼如下
// 查詢請求 NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"]; // 按照使用者姓名升序排序 NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]; request.sortDescriptors = @[sort]; /** 參數: 1> 查詢請求 2> 資料庫上下文 3> 表格中用於分組的欄位名 4> 緩衝名稱 */ _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil]; // 設定代理 _fetchedResultsController.delegate = self; // 執行請求,抓取資料 NSError *error = nil; if ([_fetchedResultsController performFetch:&error]) { NSLog(@"查詢成功"); NSLog(@"%@", _fetchedResultsController.sections); } else { NSLog(@"查詢失敗 %@", error.localizedDescription); }
建立查詢結果控制器需要一個查詢請求(類似於web請求中的URLrequest)和要查詢的上下文
查詢請求中需要寫上查詢model的名字,並且還需要給其設定一個排序的規則NSSortDescriptor對象(可以設定多個欄位排序)
建立查詢結果控制器的時候sectionNameKeyPath,有興趣的可以研究一下,這個可以用來將查詢後的資料分組(傳入nil意味著所有的資料都在一組裡)
上面的代碼只是讓查詢結果控制器去資料庫裡面尋找,如何將資料從結果控制器裡面取出來呢?
Person *person = [_fetchedResultsController objectAtIndexPath:indexPath];
上面的代碼可以將查詢結果取出來,看著是不是很眼熟,跟TableView的一些方法是不是很像~,你在看看下面的代碼
int total = [_fetchedResultsController.sections[0] numberOfObjects];
上面的代碼可以返回第0組資料中所含有的資料總數,是不是覺得跟tableview更像了
查詢到這就完了,下面在看看如何刪除一個對象
// 讓上下文刪除 [context deleteObject:person]; // 上下文儲存 if ([context save:nil]) { NSLog(@"刪除成功!"); } else { NSLog(@"刪除失敗!"); }
上面一句話就搞定~怎麼修改對象呢?
per.name = @"wokao"; if ([context save:nil]) { NSLog(@"儲存成功"); // 返回上級視圖控制器 [self.navigationController popViewControllerAnimated:YES]; } else { NSLog(@"儲存失敗!"); }
直接在對象上修改你要修改的,然後save就行了,~╮(╯▽╰)╭是不是木有壓力呢?
還有一個問題就是查詢到了很多結果,怎麼才能篩選一下呢>?你查到了100個結果,但是只有10個是你像看到的,怎麼辦呢?
表著急~有辦法~
// 1. 擷取到查詢結果控制器中的查詢請求 NSFetchRequest *reqest = _fetchedResultsController.fetchRequest; if (searchText.length > 0) { // 佈建要求的過濾謂詞 reqest.predicate = [NSPredicate predicateWithFormat:@"name CONTAINS %@", searchText]; } else { reqest.predicate = nil; } // 執行查詢 if ([_fetchedResultsController performFetch:nil]) { NSLog(@"重新整理成功"); [self.tableView reloadData]; }
其實篩選就是把當時給查詢結果控制器的請求在拿出來,加點謂詞進去~然後重新執行查詢就行了~
如果想恢複到原來的查詢結果,request.predicate = nil;然後再重新查詢就行了~
jiandannnnnnnn ba
另外CoreData可以很輕鬆的儲存位元據,如果你想用sql儲存位元據啥的估計要費點勁了,而寫很有可能或拖累你的查詢效能
下面一行代碼可以將UIImage對象轉換為NSData對象
UIImagePNGRepresentation(_iconButton.imageView.image);
以後你會用的找的~~~~~~
還有一個照片選擇控制器
UIImagePickerController
至於怎麼用,自己去查資料~