亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

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

2020-07-26 03:19:07
字體:
來源:轉載
供稿:網友

NSEntityDescription是實體描述對象,它可以類比如數據庫中的表,NSEntityDescription存放的是表的結構信息。這些類都是一些抽象的結構類,并不存儲實際每條數據的信息,具體的數據由NSManagedObject類來描述,我們一般會將實體類化繼承于NSManagedObject。

Xocde工具提供了快捷的實體類化功能,還拿我們一開始創建的班級與學生實體來演示,點擊.xcdatamodeld文件,點擊Xcode工具上方導航欄的Editor標簽,選擇Creat NSManagedObject Subclass選項,在彈出的窗口中勾選要類化的實體,如下圖:

201662893746411.png (320×266)

201662893807952.png (446×396)

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

一、創建一條數據

使用如下代碼進行數據的創建:

    //讀取數據模型文件
    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 NSXMLStoreType;//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文件,其中有一張表中添加進了一條數據。

二、查詢數據

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:方法中,如果設置第三個參數,則會以第三個參數為鍵值進行數據的分區。當數據發生變化時,將通過代理進行方法的回調。

三、與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)

四、將數據變化映射到視圖

//數據將要改變時調用的方法
- (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];
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品在线小视频| 成人午夜在线视频一区| 波霸ol色综合久久| 亚洲精品美女网站| 久久精品国产v日韩v亚洲| 国模叶桐国产精品一区| 国产精品一二三视频| 日韩在线视频免费观看| 亚洲人成在线电影| 亚洲第一精品久久忘忧草社区| 国产精品专区h在线观看| 欧美日韩亚洲精品一区二区三区| 久久九九国产精品怡红院| 国产精品中文字幕久久久| 日韩成人xxxx| 久久999免费视频| 岛国视频午夜一区免费在线观看| 亚洲精品国产拍免费91在线| 欧美性开放视频| 91精品国产综合久久久久久蜜臀| 九色精品免费永久在线| 欧美国产日韩一区二区在线观看| 日韩欧美在线免费观看| 久久精品久久久久| 欧美肥臀大乳一区二区免费视频| 亚洲人成伊人成综合网久久久| 情事1991在线| 国产亚洲日本欧美韩国| 国产suv精品一区二区三区88区| 日韩av电影中文字幕| 亚洲第一视频在线观看| 久久久亚洲精选| 成人精品在线观看| 欧美激情xxxx性bbbb| 亚洲国产精品女人久久久| 欧美在线免费看| 亚洲日本中文字幕免费在线不卡| 91av视频在线| 中文欧美日本在线资源| 国产一区二区三区丝袜| 亚洲在线一区二区| 亚洲精品免费网站| 午夜精品99久久免费| 日韩视频免费大全中文字幕| 中文字幕精品在线视频| 亚洲成av人影院在线观看| 91产国在线观看动作片喷水| 国产精品久久久久久婷婷天堂| 精品一区二区三区四区在线| 国产精品看片资源| 美女999久久久精品视频| 另类色图亚洲色图| 亚洲国产91色在线| 日韩三级影视基地| 国产精品久久久久高潮| 精品福利一区二区| 91免费视频国产| 精品国产自在精品国产浪潮| 久久久999国产精品| 日韩精品视频免费| 久久久影视精品| 国产一区二区香蕉| 91久热免费在线视频| 大量国产精品视频| 欧美做受高潮1| 欧美电影免费观看大全| 亚洲精品日韩丝袜精品| 国产精品wwwwww| 日本高清视频精品| 久久久久免费视频| 国产精品久久一区主播| 成人av资源在线播放| 欧美午夜片欧美片在线观看| 久久视频在线播放| 亚洲无av在线中文字幕| 成人写真视频福利网| 成人a免费视频| 91精品国产91久久久久| 久久伊人色综合| 日韩精品免费综合视频在线播放| 亚洲高清在线观看| 最近免费中文字幕视频2019| 亚洲女人天堂成人av在线| 亚洲电影天堂av| 成人免费网站在线| 欧美激情精品久久久久久蜜臀| 成人女保姆的销魂服务| 在线播放国产精品| 欧美日韩国产丝袜另类| 成人免费网站在线看| 色综合导航网站| 97精品在线观看| 久久999免费视频| 欧美大尺度激情区在线播放| 欧美性资源免费| www国产精品com| 91中文在线视频| 国产黑人绿帽在线第一区| 亚洲电影免费在线观看| 国产一区二区在线播放| 一区二区三区 在线观看视| 91精品国产网站| 欧美午夜视频在线观看| 国内精品久久久久久久| www.日韩免费| 欧美视频在线观看免费| 国产精品久久久久久久久借妻| 久99久在线视频| 欧美日韩国产激情| 亚洲国产精品高清久久久| 久久好看免费视频| 精品国产一区二区三区四区在线观看| 欧美疯狂做受xxxx高潮| 亚洲成色777777女色窝| 国产日韩中文字幕在线| 欧美日韩国产激情| 欧美国产视频一区二区| 欧美日韩国产在线看| 久久精品国产99国产精品澳门| 中文字幕在线看视频国产欧美| 成人日韩av在线| 福利视频导航一区| 欧美日韩亚洲一区二区三区| 午夜精品蜜臀一区二区三区免费| 成人黄色大片在线免费观看| 精品小视频在线| 欧美激情精品久久久久久大尺度| 国产精品99导航| 色噜噜狠狠色综合网图区| 成人免费在线视频网站| 日韩激情片免费| 538国产精品一区二区免费视频| 上原亚衣av一区二区三区| 欧美激情免费视频| 国产一区二区三区四区福利| 国产福利视频一区二区| 亚洲男人天堂2019| 国产精品美女主播| 国产精品视频永久免费播放| 91色中文字幕| 久久精品国产欧美亚洲人人爽| 亚洲色图综合久久| 国产极品精品在线观看| 欧美激情视频网址| 国产亚洲欧美日韩美女| 中文字幕日韩精品有码视频| 精品电影在线观看| 欧美日韩成人在线视频| 91手机视频在线观看| 国产精品成人免费视频| 亚洲成**性毛茸茸| 欧美日韩一区二区在线播放| 26uuu久久噜噜噜噜| 另类天堂视频在线观看| 亚洲精选中文字幕| 欧美大片大片在线播放| 精品久久久久久久久久久久久| 国产亚洲欧洲黄色| 成人免费直播live| 在线日韩日本国产亚洲| 亚洲综合中文字幕68页| 午夜精品久久久久久99热软件| 中文字幕亚洲第一| 国外日韩电影在线观看|