iOS資料存放區之CoreData

來源:互聯網
上載者:User

標籤: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

至於怎麼用,自己去查資料~

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.