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

首頁 > 學院 > 開發設計 > 正文

IOS數據存儲之CoreData詳解

2019-11-14 18:46:19
字體:
來源:轉載
供稿:網友

  Core Date是ios3.0后引入的數據持久化解決方案,它是是蘋果官方推薦使用的,不需要借助第三方框架。Core Date實際上是對SQLite的封裝,提供了更高級的持久化方式。在對數據庫操作時,不需要使用sql語句,也就意味著即使不懂sql語句,也可以操作數據庫中的數據。

  在各類應用開發中使用數據庫操作時通常都會用到 (ORM) “對象關系映射”,Core Data就是這樣的一種模式。ORM是將關系數據庫中的表,轉化為程序中的對象,但實際上是對數據中的數據進行操作。

  在使用Core Data進?行數據庫存取并不需要手動創建數據庫,創建數據庫的過程完全由Core Data框架自動完成,開發者需要做的就是把模型創建起來,具體數據庫的創建不需要管。簡單點說,Core Data實際上是將數據庫的創建、表的創建、對象和表的轉換等操作封裝起來,極大的簡化了我們的操作。

  Core Date與SQLite相比較,SQLite比較原始,操作比較復雜,使用的是C的函數對數據庫進行操作,但是SQLite可控性更強,并且能夠跨平臺。

  下面,讓我們一起來學習一下Core Data的簡單使用。

一、使用Core Data,添加實體和模型

  在創建項目的時候可以選擇使用Core Data,項目創建成功后,會在AppDelegate類中自動添加相關代碼,此外,還會自動生成一個數據模型文件JRCoreData.xcdatamodeld

 

AppDelegate.h

//  AppDelegate.h//  JRCoreData////  Created by jerei on 15-6-24.//  Copyright (c) 2015年 jerehedu. All rights reserved.//#import <UIKit/UIKit.h>#import <CoreData/CoreData.h>@interface AppDelegate : UIResponder <UIapplicationDelegate>@PRoperty (strong, nonatomic) UIWindow *window;@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;- (void)saveContext;- (NSURL *)applicationDocumentsDirectory;@end

AppDelegate.m

//  AppDelegate.m//  JRCoreData////  Created by jerei on 15-6-24.//  Copyright (c) 2015年 jerehedu. All rights reserved.//#import "AppDelegate.h"@interface AppDelegate ()@end@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    // Override point for customization after application launch.    return YES;}- (void)applicationWillResignActive:(UIApplication *)application {    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.}- (void)applicationDidEnterBackground:(UIApplication *)application {    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.}- (void)applicationWillEnterForeground:(UIApplication *)application {    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.}- (void)applicationDidBecomeActive:(UIApplication *)application {    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.}- (void)applicationWillTerminate:(UIApplication *)application {    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.    // Saves changes in the application's managed object context before the application terminates.    [self saveContext];}#pragma mark - Core Data stack@synthesize managedObjectContext = _managedObjectContext;@synthesize managedObjectModel = _managedObjectModel;@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;- (NSURL *)applicationDocumentsDirectory {    // The directory the application uses to store the Core Data store file. This code uses a directory named "com.jerehedu.JRCoreData" in the application's documents directory.    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];}- (NSManagedObjectModel *)managedObjectModel {    // The managed object model for the application. It is a fatal error for the application not to be able to find and load its model.    if (_managedObjectModel != nil) {        return _managedObjectModel;    }    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"JRCoreData" withExtension:@"momd"];    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];    return _managedObjectModel;}- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {    // The persistent store coordinator for the application. This implementation creates and return a coordinator, having added the store for the application to it.    if (_persistentStoreCoordinator != nil) {        return _persistentStoreCoordinator;    }        // Create the coordinator and store        _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"JRCoreData.sqlite"];    NSError *error = nil;    NSString *failureReason = @"There was an error creating or loading the application's saved data.";    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {        // Report any error we got.        NSMutableDictionary *dict = [NSMutableDictionary dictionary];        dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data";        dict[NSLocalizedFailureReasonErrorKey] = failureReason;        dict[NSUnderlyingErrorKey] = error;        error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];        // Replace this with code to handle the error appropriately.        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);        abort();    }        return _persistentStoreCoordinator;}- (NSManagedObjectContext *)managedObjectContext {    // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.)    if (_managedObjectContext != nil) {        return _managedObjectContext;    }        NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];    if (!coordinator) {        return nil;    }    _managedObjectContext = [[NSManagedObjectContext alloc] init];    [_managedObjectContext setPersistentStoreCoordinator:coordinator];    return _managedObjectContext;}#pragma mark - Core Data Saving support- (void)saveContext {    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;    if (managedObjectContext != nil) {        NSError *error = nil;        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {            // Replace this implementation with code to handle the error appropriately.            // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);            abort();        }    }}@end

  如果項目在創建的時候沒有選擇使用Core Data,但是在后面需要使用,那么需要手動的添加AppDelegate中的相關代碼。此外,還需要手動添加一個Data Model文件

 

  創建Data Model文件時需要注意,文件名稱要與AppDelegate.m中managedObjectModel方法中提到的文件名稱相匹配。

  有了Data Model文件后,就可以在里面添加實體和關系,實際上就是向數據庫中添加表格和建立表格之間的關聯。添加實體如圖所示:

 

  每個學生有一個所在的班級,每個班級中有多個學生,因此,學生和班級之間可以建立關系。建立關系如圖所示:

 

  建立關系之后,可以切換顯示的樣式,以圖表的方式查看實體之間的關系,如圖所示:

 

  完成上述步驟,數據庫中表格的創建就已經完成,和使用SQLite比較,省略了sql語句以及調用C函數操作數據庫的步驟,另外,在創建實體的時候不需要設置主鍵,實體對象的屬性的類型是OC的類型,實體中其他實體對象類型是通過建立關系添加的。

  創建好實體后,可以通過添加NSManagedObject subclass文件,系統可以自動添加實體對應的數據模型類,如圖所示:

 

二、通過代碼實現數據庫的操作

  1、 向學生表中插入一條數據

  在使用Core Data的時候,AppDelegate中添加了NSManagedObjectContext對象,需要獲得這個管理對象的上下文來進行操作。在操作的過程中,需要得到NSManagedObject實體,然后通過kvc設置實體的屬性值,最后通過上下文調用save方法保存數據。

- (void)insert {        AppDelegate *delegate = [[UIApplication sharedApplication] delegate];        //1. 獲得context    NSManagedObjectContext *context = delegate.managedObjectContext;    //2. 找到實體結構,并生成一個實體對象    /*     NSEntityDescription實體描述,也就是表的結構     參數1:表名字     參數2:實例化的對象由誰來管理,就是context     */    NSManagedObject *stu = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:context];        NSManagedObject *class1 = [NSEntityDescription insertNewObjectForEntityForName:@"Classes" inManagedObjectContext:context];    [class1 setValue:[NSNumber numberWithInt:1] forKey:@"c_id"];    [class1 setValue:@"一班" forKey:@"c_name"];        //3. 設置實體屬性值    [stu setValue:[NSNumber numberWithInt:1] forKey:@"s_id"];    [stu setValue:@"jerehedu" forKey:@"s_name"];    [stu setValue:class1 forKey:@"s_class"];        //4. 調用context,保存實體,如果沒有成功,返回錯誤信息    NSError *error;    if ([context save:&error]) {        NSLog(@"save ok");    }    else    {        NSLog(@"%@",error);    }}

  2、查詢學生表中全部數據

  查詢與插入數據操作類似,但是多了構造查詢對象的步驟,查詢得到結果集是一個數組,遍歷數組,可以取出查詢數據。

- (void)selectAll {    AppDelegate *delegate = [[UIApplication sharedApplication] delegate];        NSManagedObjectContext *context = delegate.managedObjectContext;        NSEntityDescription *stu = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:context];        //構造查詢對象    NSFetchRequest *request = [[NSFetchRequest alloc] init];    [request setEntity:stu];        //執行查詢,返回結果集    NSArray *resultAry = [context executeFetchRequest:request error:nil];        //遍歷結果集    for (NSManagedObject *enity in resultAry) {        NSLog(@"id=%i name=%@ class=%@",[[enity valueForKey:@"s_id"] intValue],[enity valueForKey:@"s_name"],[[enity valueForKey:@"s_class"] valueForKey:@"c_name"]);    }}

  3、查詢指定條件的學生信息,并更新

  指定條件的查詢除了需要構造查詢對象,還需要把查詢的條件用謂詞表示。然后遍歷查詢結果數組中的數據,進行更行,并保存。

- (void)update{    //    更新 (從數據庫找到-->更新)    AppDelegate *delegate = [[UIApplication sharedApplication] delegate];    NSManagedObjectContext *context = delegate.managedObjectContext;        NSEntityDescription *stu = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:context];        NSFetchRequest *request = [NSFetchRequest new];    [request setEntity:stu];        //構造查詢條件,相當于where子句    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"s_id=%i",1];        //把查詢條件放進去    [request setPredicate:predicate];        //執行查詢    NSArray *studentAry = [context executeFetchRequest:request error:nil];    if (studentAry.count>0)    {        //更新里面的值        NSManagedObject *obj = studentAry[0];        [obj setValue:@"apple" forKey:@"s_name"];    }    [context save:nil];        //顯示    [self selectAll];}

  4、刪除指定條件的學生信息

  刪除之前首先需要根據條件進行查詢,查詢到數據后刪除,并保存。

- (void)delete{    //刪除 先找到,然后刪除    AppDelegate *delegate = [[UIApplication sharedApplication] delegate];    NSManagedObjectContext *context = delegate.managedObjectContext;        NSEntityDescription *stu = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:context];        NSFetchRequest *request = [NSFetchRequest new];    [request setEntity:stu];        //構造查詢條件,相當于where子句    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"s_id=%i",1];        //把查詢條件放進去    [request setPredicate:predicate];    //執行查詢    NSManagedObject *obj = [[context executeFetchRequest:request error:nil] lastObject];    //刪除    if (obj) {        [context deleteObject:obj];        [context save:nil];    }        [self selectAll];}
三、小結

  Core Data是蘋果官方推薦使用的數據持久化方式,在使用的過程中,不需要導入數據庫框架,也不需要使用sql語句操作數據庫,完全是按照面向對象的思想,使用實體模型來操作數據庫。在使用的過程中需要注意的是,如果模型發生了變化,可以選擇重新生成實體類文件,但是自動生成的數據庫并不會自動更新,需要考慮重新生成數據庫,并把之前數據庫中數據進行移植。Core Data能夠簡化操作,但是它不支持跨平臺使用,如果想實現跨平臺,就需要使用SQLite來進行數據持久化。

 

  疑問咨詢或技術交流,請加入官方QQ群:JRedu技術交流 (452379712)

 

作者:杰瑞教育
出處:http://www.49028c.com/jerehedu/ 
本文版權歸煙臺杰瑞教育科技有限公司和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久热99视频在线观看| 亚洲美女激情视频| 91免费视频网站| 日本久久久久久久久久久| 国产一区二区成人| 亚洲第一在线视频| 奇门遁甲1982国语版免费观看高清| 久久久久久久久久国产精品| 国产亚洲精品久久久久久| 精品国偷自产在线视频| 97视频在线观看免费高清完整版在线观看| 韩国精品美女www爽爽爽视频| 欧美精品videossex性护士| 欧美日韩激情视频| 欧美一级视频免费在线观看| 欧美日韩激情美女| 97成人精品视频在线观看| 日韩在线观看高清| 高清欧美性猛交| 国产做受69高潮| 97精品免费视频| 欧美在线精品免播放器视频| 欧美一级片久久久久久久| 久久精品在线播放| 国产午夜精品免费一区二区三区| 午夜精品一区二区三区在线视| 亚洲欧美日本另类| 欧美一级黑人aaaaaaa做受| 亚洲精品一二区| 国模吧一区二区三区| 久久亚洲国产精品成人av秋霞| 色噜噜久久综合伊人一本| 欧美一区二区三区……| 亚洲综合精品伊人久久| 在线成人中文字幕| 精品国产91乱高清在线观看| 中文字幕精品一区久久久久| 日韩欧美国产黄色| 亚洲经典中文字幕| www.久久草.com| 成人免费直播live| 日韩www在线| 亚洲人精选亚洲人成在线| 日韩欧美成人精品| 欧美精品videos另类日本| 亚洲午夜未满十八勿入免费观看全集| 久久91精品国产| 欧美性xxxxxxxxx| 91精品国产成人| 国产精品成av人在线视午夜片| 欧美丰满少妇xxxxx| 亚洲国产精品yw在线观看| 影音先锋日韩有码| 国产精品白丝av嫩草影院| 欧美大片第1页| 宅男66日本亚洲欧美视频| 亚洲激情免费观看| 久久精品福利视频| 亚洲美腿欧美激情另类| 色噜噜久久综合伊人一本| 国产日韩精品入口| 久久精品国产一区二区三区| 亚洲天堂影视av| 国内精品久久久| 欧美午夜激情小视频| 亲爱的老师9免费观看全集电视剧| 人人澡人人澡人人看欧美| 亚洲美女在线视频| 精品福利在线视频| 亚洲精品国精品久久99热一| 日韩av一区在线观看| 亚洲欧美国内爽妇网| 国产v综合v亚洲欧美久久| 欧美色欧美亚洲高清在线视频| y97精品国产97久久久久久| 国产成人福利网站| 一区二区中文字幕| 欧洲中文字幕国产精品| 成人a视频在线观看| 欧美电影免费观看| 久久色精品视频| 亚洲电影av在线| 国产精品久久久久秋霞鲁丝| 欧美孕妇性xx| 97婷婷大伊香蕉精品视频| 中文字幕日韩在线观看| 亚洲免费视频观看| 日韩亚洲综合在线| www.亚洲人.com| 国产精品久久在线观看| 国产精品一区二区三区久久久| 欧美日韩加勒比精品一区| 欧美国产欧美亚洲国产日韩mv天天看完整| 久久在线免费观看视频| 在线精品视频视频中文字幕| 在线观看日韩www视频免费| 日韩av在线网页| 久久久亚洲精选| 欧美国产视频一区二区| 国产精品视频专区| 茄子视频成人在线| 日韩欧美在线视频观看| 国产精品一区专区欧美日韩| 日韩欧美一区二区三区| 久久影院资源网| 亚洲自拍偷拍色图| 国产欧美精品va在线观看| 在线日韩精品视频| 日韩中文在线中文网在线观看| 亚洲男女自偷自拍图片另类| 成人欧美一区二区三区在线湿哒哒| 免费不卡欧美自拍视频| 热99精品只有里视频精品| 精品国产欧美一区二区五十路| 欧美乱大交做爰xxxⅹ性3| 午夜精品福利在线观看| 97国产成人精品视频| 欧美激情精品久久久久久蜜臀| 精品亚洲精品福利线在观看| 久久国产精品99国产精| 亚洲精品国精品久久99热| 成人中文字幕+乱码+中文字幕| 亚洲人成在线观看| 久久国产精彩视频| 亚洲丝袜在线视频| 国产精品久久久久影院日本| 欧美黑人视频一区| 亚洲美女黄色片| 在线视频日本亚洲性| 成人激情在线观看| 亚洲免费视频一区二区| 欧美小视频在线| 中文字幕亚洲国产| 亚洲成人av在线播放| 国产欧美日韩免费| 国产精品视频内| 永久555www成人免费| 亚洲欧美三级在线| 国产精品www网站| 久久久999精品免费| 亚洲天堂男人的天堂| 夜夜嗨av一区二区三区四区| 欧美中文字幕在线视频| 久久久久亚洲精品| 久久久精品电影| 欧美激情亚洲视频| 中国日韩欧美久久久久久久久| 亚洲综合大片69999| 在线精品高清中文字幕| 国产亚洲一区二区在线| 日韩欧美在线播放| 国产精品成人免费电影| 久久夜色精品国产欧美乱| 欧洲s码亚洲m码精品一区| 色妞色视频一区二区三区四区| 欧美噜噜久久久xxx| 国产一区在线播放| 欧美日韩国产精品一区| 亚洲电影av在线| 91亚洲一区精品| 成人免费福利在线| 大桥未久av一区二区三区| 中文字幕精品—区二区| 欧美理论电影在线播放|