你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS App中數據治理框架Core Data的根本數據操作教程

iOS App中數據治理框架Core Data的根本數據操作教程

編輯:IOS開發綜合

NSEntityDescription是實體描寫對象,它可以類好比數據庫中的表,NSEntityDescription寄存的是表的構造信息。這些類都是一些籠統的構造類,其實不存儲現實每條數據的信息,詳細的數據由NSManagedObject類來描寫,我們普通會將實體類化繼續於NSManagedObject。

Xocde對象供給了快捷的實體類化功效,還拿我們一開端創立的班級與先生實體來演示,點擊.xcdatamodeld文件,點擊Xcode對象上方導航欄的Editor標簽,選擇Creat NSManagedObject Subclass選項,在彈出的窗口中勾選要類化的實體,以下圖:

201662893746411.png (320×266)

201662893807952.png (446×396)

這時候,Xcode會主動為我們創立一個文件,這些文件中有各個類中屬性的聲明。

1、創立一條數據

應用以下代碼停止數據的創立:

    //讀取數據模子文件
    NSURL *modelUrl = [[NSBundle mainBundle]URLForResource:@"Model" withExtension:@"momd"];
    //創立數據模子
    NSManagedObjectModel * mom = [[NSManagedObjectModel alloc]initWithContentsOfURL:modelUrl];
    //創立耐久化存儲調和者
    NSPersistentStoreCoordinator * psc = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:mom];
    //數據庫保留途徑
    NSURL * path =[NSURL fileURLWithPath:[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:@"CoreDataExample.SQLite"]];
    //為耐久化調和者添加一個數據吸收棧
    /*
    可以支撐的類型以下:
     NSString * const NSSQLiteStoreType;//SQLite
     NSString * const NSXmlRss/ target=_blank class=infotextkey>XmlStoreType;//XmlRss/ target=_blank class=infotextkey>Xml
     NSString * const NSBinaryStoreType;//二進制
     NSString * const NSInMemoryStoreType;//內存
    */
    [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:path options:nil error:nil];
    //創立數據治理高低文
    NSManagedObjectContext * moc = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType];
    //聯系關系耐久化調和者
    [moc setPersistentStoreCoordinator:psc];
    //創立數據對象
    /*
    數據對象的創立是經由過程實體名獲得到的
    */
    SchoolClass * modelS = [NSEntityDescription insertNewObjectForEntityForName:@"SchoolClass" inManagedObjectContext:moc];
    //對數據停止設置
    modelS.name = @"第一班";
    modelS.stuNum = @60;
    //停止存儲
    if ([moc save:nil]) {
        NSLog(@"新增勝利");
    }
    NSLog(@"%@",[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:@"CoreDataExample.sqlite"]);
找到在打印出的途徑,會發明外面多了一個sqlite文件,個中有一張表中添加進了一條數據。

2、查詢數據

CoreData中經由過程查詢要求來對數據停止查詢操作,查詢要求由NSFetchRequest來停止治理和保護。

NSFetchRequest重要供給兩個方面的查詢辦事:

1.供給規模查詢的相干功效

2.供給查詢成果前往類型與排序的相干功效

NSFetchRequest中經常使用辦法以下:

//創立一個實體的查詢要求 可以懂得為在某個表中停止查詢
+ (instancetype)fetchRequestWithEntityName:(NSString*)entityName;
//查詢前提
@property (nullable, nonatomic, strong) NSPredicate *predicate;
//數據排序
@property (nullable, nonatomic, strong) NSArray<NSSortDescriptor *> *sortDescriptors;
//每次查詢前往的數據條數
@property (nonatomic) NSUInteger fetchLimit;
//設置查詢到數據的前往類型
/*
typedef NS_OPTIONS(NSUInteger, NSFetchRequestResultType) {
    NSManagedObjectResultType  = 0x00,
    NSManagedObjectIDResultType  = 0x01,
    NSDictionaryResultType          NS_ENUM_AVAILABLE(10_6,3_0) = 0x02,
    NSCountResultType    NS_ENUM_AVAILABLE(10_6,3_0) = 0x04
};
*/
@property (nonatomic) NSFetchRequestResultType resultType;
//設置查詢成果能否包括籽實體
@property (nonatomic) BOOL includesSubentities;
//設置要查詢的屬性值
@property (nullable, nonatomic, copy) NSArray *propertiesToFetch;
在SchoolClass實體中查詢數據,應用以下的代碼:

    //創立一條查詢要求
    NSFetchRequest * request = [NSFetchRequest fetchRequestWithEntityName:@"SchoolClass"];
    //設置前提為 stuNum=60的數據
    [request setPredicate:[NSPredicate predicateWithFormat:@"stuNum == 60"]];
    //停止查詢操作
    NSArray * res = [moc executeFetchRequest:request error:nil];
    NSLog(@"%@",[res.firstObject stuNum]);

停止數據初始化

    NSFetchedResultsController的初始化須要一個查詢要求和一個數據操作高低文。代碼示例以下:

//遵照協定
@interface ViewController ()<NSFetchedResultsControllerDelegate>
{
    //數據橋接對象
    NSFetchedResultsController * _fecCon;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //停止初始化操作
    NSURL *modelUrl = [[NSBundle mainBundle]URLForResource:@"Model" withExtension:@"momd"];
    NSManagedObjectModel * mom = [[NSManagedObjectModel alloc]initWithContentsOfURL:modelUrl];
    NSPersistentStoreCoordinator * psc = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:mom];
    NSURL * path =[NSURL fileURLWithPath:[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:@"CoreDataExample.sqlite"]];
    [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:path options:nil error:nil];
    NSManagedObjectContext * moc = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType];
    [moc setPersistentStoreCoordinator:psc];
    NSFetchRequest * request = [NSFetchRequest fetchRequestWithEntityName:@"SchoolClass"];
    //設置數據排序
    [request setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"stuNum" ascending:YES]]];
    //停止數據橋接對象的初始化
    _fecCon = [[NSFetchedResultsController alloc]initWithFetchRequest:request managedObjectContext:moc sectionNameKeyPath:nil cacheName:nil];
    //設置署理
    _fecCon.delegate=self;
    //停止數據查詢
    [_fecCon performFetch:nil];
}
@end
用於初始化NSFecthedResultsController的數據要求對象必需設置一個排序規矩。在initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName:辦法中,假如設置第三個參數,則會以第三個參數為鍵值停止數據的分區。當數據產生變更時,將經由過程署理停止辦法的回調。

3、與UITableView停止數據綁定

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"cellid"];
    if (!cell) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cellid"];
    }
    //獲得響應數據模子
    SchoolClass * obj = [_fecCon objectAtIndexPath:indexPath];
    cell.textLabel.text = obj.name;
    cell.detailTextLabel.text = [NSString stringWithFormat:@"有%@人",obj.stuNum];
    return cell;
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return [_fecCon sections].count;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    id<NSFetchedResultsSectionInfo> info =  [_fecCon sections][section];
    return [info numberOfObjects];
   
}
後果以下:

201662893909721.png (313×583)

4、將數據變更映照到視圖

//數據將要轉變時挪用的辦法
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
    //開啟tableView更新預處置
    [[self tableView] beginUpdates];
}
//分區數據轉變時挪用的辦法
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{
    //斷定行動類型
    switch(type) {
        //拔出新分區
        case NSFetchedResultsChangeInsert:
            [[self tableView] insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;
        //刪除分區
        case NSFetchedResultsChangeDelete:
            [[self tableView] deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;
        //挪動分區
        case NSFetchedResultsChangeMove:
        //更新分區
        case NSFetchedResultsChangeUpdate:
            break;
    }
}
//數據轉變時回調的署理
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type neWindexPath:(NSIndexPath *)neWindexPath
{
    switch(type) {
        //拔出數據
        case NSFetchedResultsChangeInsert:
            [[self tableView] insertRowsAtIndexPaths:@[neWindexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
        //刪除數據
        case NSFetchedResultsChangeDelete:
            [[self tableView] deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
        //更新數據
        case NSFetchedResultsChangeUpdate:
            [self reloadData];
            break;
        //挪動數據
        case NSFetchedResultsChangeMove:
            [[self tableView] deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [[self tableView] insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}
//數據更新停止挪用的署理
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [[self tableView] endUpdates];
}

【iOS App中數據治理框架Core Data的根本數據操作教程】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved