国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

CoreData

2019-11-14 17:57:38
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

簡(jiǎn)介

  Core Data是iOS5之后才出現(xiàn)的一個(gè)框架,它提供了對(duì)象-關(guān)系映射(ORM)的功能,即能夠?qū)C對(duì)象轉(zhuǎn)化成數(shù)據(jù),保存在SQLite數(shù)據(jù)庫(kù)文件中,也能夠?qū)⒈4嬖跀?shù)據(jù)庫(kù)中的數(shù)據(jù)還原成OC對(duì)象。在此數(shù)據(jù)操作期間,我們不需要編寫(xiě)任何SQL語(yǔ)句,這個(gè)有點(diǎn)類似于著名的Hibernate持久化框架,不過(guò)功能肯定是沒(méi)有Hibernate強(qiáng)大的。簡(jiǎn)單地用下圖描述下它的作用:

abc

左邊是關(guān)系模型,即數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)里面有張person表,person表里面有id、name、age三個(gè)字段,而且有2條記錄;

右邊是對(duì)象模型,可以看到,有2個(gè)OC對(duì)象;

利用Core Data框架,我們就可以輕松地將數(shù)據(jù)庫(kù)里面的2條記錄轉(zhuǎn)換成2個(gè)OC對(duì)象,也可以輕松地將2個(gè)OC對(duì)象保存到數(shù)據(jù)庫(kù)中,變成2條表記錄,而且不用寫(xiě)一條SQL語(yǔ)句。

 

模型文件

  在Core Data,需要進(jìn)行映射的對(duì)象稱為實(shí)體(entity),而且需要使用Core Data的模型文件來(lái)描述app中的所有實(shí)體和實(shí)體屬性。這里以Person(人)和Card(身份證)2個(gè)實(shí)體為例子,先看看實(shí)體屬性和實(shí)體之間的關(guān)聯(lián)關(guān)系:
abc
Person實(shí)體中有:name(姓名)、age(年齡)、card(身份證)三個(gè)屬性
Card實(shí)體中有:no(號(hào)碼)、person(人)兩個(gè)屬性

接下來(lái)看看創(chuàng)建模型文件的過(guò)程:
1.選擇模板
abcabc

2.添加實(shí)體


3.添加Person的2個(gè)基本屬性


4.添加Card的1個(gè)基本屬性



5.建立Card和Person的關(guān)聯(lián)關(guān)系

        

右圖中的表示Card中有個(gè)Person類型的person屬性,目的就是建立Card跟Person之間的一對(duì)一關(guān)聯(lián)關(guān)系(建議補(bǔ)上這一項(xiàng)),在Person中加上Inverse屬性后,你會(huì)發(fā)現(xiàn)Card中Inverse屬性也自動(dòng)補(bǔ)上了

 

 

了解NSManagedObject

 

1.通過(guò)Core Data從數(shù)據(jù)庫(kù)取出的對(duì)象,默認(rèn)情況下都是NSManagedObject對(duì)象
  

2.NSManagedObject的工作模式有點(diǎn)類似于NSDictionary對(duì)象,通過(guò)鍵-值對(duì)來(lái)存取所有的實(shí)體屬性

1> setValue:forKey:存儲(chǔ)屬性值(屬性名為key)

2> valueForKey:獲取屬性值(屬性名為key)


CoreData中的核心對(duì)象



注:黑色表示類名,紅色表示類里面的一個(gè)屬性
開(kāi)發(fā)步驟總結(jié):
1.初始化NSManagedObjectModel對(duì)象,加載模型文件,讀取app中的所有實(shí)體信息
2.初始化NSPersistentStoreCoordinator對(duì)象,添加持久化庫(kù)(這里采取SQLite數(shù)據(jù)庫(kù))
3.初始化NSManagedObjectContext對(duì)象,拿到這個(gè)上下文對(duì)象操作實(shí)體,進(jìn)行CRUD操作

代碼實(shí)現(xiàn)

先添加CoreData.framework和導(dǎo)入主頭文件<CoreData/CoreData.h>


1.搭建上下文環(huán)境
  1. // 從應(yīng)用程序包中加載模型文件  
  2. NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];  
  3. // 傳入模型對(duì)象,初始化NSPersistentStoreCoordinator  
  4. NSPersistentStoreCoordinator *psc = [[[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model] autorelease];  
  5. // 構(gòu)建SQLite數(shù)據(jù)庫(kù)文件的路徑  
  6. NSString *docs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];  
  7. NSURL *url = [NSURL fileURLWithPath:[docs stringByAppendingPathComponent:@"person.data"]];  
  8. // 添加持久化存儲(chǔ)庫(kù),這里使用SQLite作為存儲(chǔ)庫(kù)  
  9. NSError *error = nil;  
  10. NSPersistentStore *store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error];  
  11. if (store == nil) { // 直接拋異常  
  12.     [NSException raise:@"添加數(shù)據(jù)庫(kù)錯(cuò)誤" format:@"%@", [error localizedDescription]];  
  13. }  
  14. // 初始化上下文,設(shè)置persistentStoreCoordinator屬性  
  15. NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];  
  16. context.persistentStoreCoordinator = psc;  
  17. // 用完之后,記得要[context release];  

2.添加數(shù)據(jù)到數(shù)據(jù)庫(kù)
[java] view plaincopy
 
  1. // 傳入上下文,創(chuàng)建一個(gè)Person實(shí)體對(duì)象  
  2. NSManagedObject *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];  
  3. // 設(shè)置Person的簡(jiǎn)單屬性  
  4. [person setValue:@"MJ" forKey:@"name"];  
  5. [person setValue:[NSNumber numberWithInt:27] forKey:@"age"];  
  6. // 傳入上下文,創(chuàng)建一個(gè)Card實(shí)體對(duì)象  
  7. NSManagedObject *card = [NSEntityDescription insertNewObjectForEntityForName:@"Card" inManagedObjectContext:context];  
  8. [card setValue:@"4414241933432" forKey:@"no"];  
  9. // 設(shè)置Person和Card之間的關(guān)聯(lián)關(guān)系  
  10. [person setValue:card forKey:@"card"];  
  11. // 利用上下文對(duì)象,將數(shù)據(jù)同步到持久化存儲(chǔ)庫(kù)  
  12. NSError *error = nil;  
  13. BOOL success = [context save:&error];  
  14. if (!success) {  
  15.     [NSException raise:@"訪問(wèn)數(shù)據(jù)庫(kù)錯(cuò)誤" format:@"%@", [error localizedDescription]];  
  16. }  
  17. // 如果是想做更新操作:只要在更改了實(shí)體對(duì)象的屬性后調(diào)用[context save:&error],就能將更改的數(shù)據(jù)同步到數(shù)據(jù)庫(kù)  

3.從數(shù)據(jù)庫(kù)中查詢數(shù)據(jù)
[java] view plaincopy
 
  1. // 初始化一個(gè)查詢請(qǐng)求  
  2. NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];  
  3. // 設(shè)置要查詢的實(shí)體  
  4. request.entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];  
  5. // 設(shè)置排序(按照age降序)  
  6. NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:NO];  
  7. request.sortDescriptors = [NSArray arrayWithObject:sort];  
  8. // 設(shè)置條件過(guò)濾(搜索name中包含字符串"Itcast-1"的記錄,注意:設(shè)置條件過(guò)濾時(shí),數(shù)據(jù)庫(kù)SQL語(yǔ)句中的%要用*來(lái)代替,所以%Itcast-1%應(yīng)該寫(xiě)成*Itcast-1*)  
  9. NSPRedicate *predicate = [NSPredicate predicateWithFormat:@"name like %@", @"*Itcast-1*"];  
  10. request.predicate = predicate;  
  11. // 執(zhí)行請(qǐng)求  
  12. NSError *error = nil;  
  13. NSArray *objs = [context executeFetchRequest:request error:&error];  
  14. if (error) {  
  15.     [NSException raise:@"查詢錯(cuò)誤" format:@"%@", [error localizedDescription]];  
  16. }  
  17. // 遍歷數(shù)據(jù)  
  18. for (NSManagedObject *obj in objs) {  
  19.     NSLog(@"name=%@", [obj valueForKey:@"name"]  
  20. }  
注:Core Data不會(huì)根據(jù)實(shí)體中的關(guān)聯(lián)關(guān)系立即獲取相應(yīng)的關(guān)聯(lián)對(duì)象,比如通過(guò)Core Data取出Person實(shí)體時(shí),并不會(huì)立即查詢相關(guān)聯(lián)的Card實(shí)體;當(dāng)應(yīng)用真的需要使用Card時(shí),才會(huì)再次查詢數(shù)據(jù)庫(kù),加載Card實(shí)體的信息。這個(gè)就是Core Data的延遲加載機(jī)制

4.刪除數(shù)據(jù)庫(kù)中的數(shù)據(jù)
[java] view plaincopy
 
  1. // 傳入需要?jiǎng)h除的實(shí)體對(duì)象  
  2. [context deleteObject:managedObject];  
  3. // 將結(jié)果同步到數(shù)據(jù)庫(kù)  
  4. NSError *error = nil;  
  5. [context save:&error];  
  6. if (error) {  
  7.     [NSException raise:@"刪除錯(cuò)誤" format:@"%@", [error localizedDescription]];  
  8. }  

打開(kāi)CoreData的SQL語(yǔ)句輸出開(kāi)關(guān)

1.打開(kāi)Product,點(diǎn)擊EditScheme...
2.點(diǎn)擊Arguments,在ArgumentsPassed On Launch中添加2項(xiàng)
1> -com.apple.CoreData.SQLDebug
2> 1



創(chuàng)建NSManagedObject的子類

默認(rèn)情況下,利用Core Data取出的實(shí)體都是NSManagedObject類型的,能夠利用鍵-值對(duì)來(lái)存取數(shù)據(jù)。但是一般情況下,實(shí)體在存取數(shù)據(jù)的基礎(chǔ)上,有時(shí)還需要添加一些業(yè)務(wù)方法來(lái)完成一些其他任務(wù),那么就必須創(chuàng)建NSManagedObject的子類


選擇模型文件 


選擇需要?jiǎng)?chuàng)建子類的實(shí)體 


創(chuàng)建完畢后,多了2個(gè)子類 


文件內(nèi)容展示:
Person.h
[java] view plaincopy
 
  1. #import <Foundation/Foundation.h>  
  2. #import <CoreData/CoreData.h>  
  3.   
  4. @class Card;  
  5.   
  6. @interface Person : NSManagedObject  
  7.   
  8. @property (nonatomic, retain) NSString * name;  
  9. @property (nonatomic, retain) NSNumber * age;  
  10. @property (nonatomic, retain) Card *card;  
  11.   
  12. @end  

Person.m
[java] view plaincopy
 
  1. #import "Person.h"  
  2.   
  3. @implementation Person  
  4.   
  5. @dynamic name;  
  6. @dynamic age;  
  7. @dynamic card;  
  8.   
  9. @end  

Card.h
[java] view plaincopy
 
  1. #import <Foundation/Foundation.h>  
  2. #import <CoreData/CoreData.h>  
  3.   
  4. @class Person;  
  5.   
  6. @interface Card : NSManagedObject  
  7.   
  8. @property (nonatomic, retain) NSString * no;  
  9. @property (nonatomic, retain) Person *person;  
  10.   
  11. @end  

Card.m
[java] view plaincopy
 
  1. #import "Card.h"  
  2. #import "Person.h"  
  3.   
  4. @implementation Card  
  5.   
  6. @dynamic no;  
  7. @dynamic person;  
  8.   
  9. @end  

那么往數(shù)據(jù)庫(kù)中添加數(shù)據(jù)的時(shí)候就應(yīng)該寫(xiě)了:
[java] view plaincopy
 
  1. Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];  
  2. person.name = @"MJ";  
  3. person.age = [NSNumber numberWithInt:27];  
  4.   
  5. Card *card = [NSEntityDescription insertNewObjectForEntityForName:@”Card" inManagedObjectContext:context];  
  6. card.no = @”4414245465656";  
  7. person.card = card;  
  8. // 最后調(diào)用[context save&error];保存數(shù)據(jù)  

CoreData  從iOS 3.0 開(kāi)始 (orm的原理)

用coreData 來(lái)操作sqlite 對(duì)象 -> 調(diào)用插入方法

CoreData 是Mac OS X中Cocoa API的一部分, 首次出現(xiàn)在Mac OS 10.4 和iOS 3.0 中. 它提供了 對(duì)象- 關(guān)系映射 (ORM) 功能. 可以將OC對(duì)象轉(zhuǎn)化為數(shù)據(jù), 保存在SQLite數(shù)據(jù)庫(kù)文件中, 也能夠?qū)?shù)據(jù)庫(kù)的文件還原成OC對(duì)象. 在此期間, 我們不需要編寫(xiě)任何SQL語(yǔ)句. 

可以簡(jiǎn)單的理解為Cocoa對(duì)SQLite的一層封裝. 

CocoaData 好處:

一:  極大的減少M(fèi)odel層的代碼量.

二:  優(yōu)化了使用SQLite時(shí)候的性能.

三:  提供了可視化設(shè)計(jì).

 

NO.1 managedObjectContext 上下文對(duì)象 負(fù)責(zé)將我們要保存的對(duì)象存入到數(shù)據(jù)庫(kù)中, 或者從數(shù)據(jù)庫(kù)中取出數(shù)據(jù)

 

NO.2 managedObjectModel 管理對(duì)象模型 負(fù)責(zé)把我們?cè)?CoreDataDemo.xcdatamodeld 文件中添加的entity(實(shí)體)轉(zhuǎn)化為sqlite數(shù)據(jù)庫(kù)中的表.

 

NO.3 persistentStoreCoordinator 持久化存儲(chǔ)協(xié)調(diào)器 負(fù)責(zé)把要保存的數(shù)據(jù)(sqlite文件) 存儲(chǔ)到沙盒中某個(gè)位置.

 

 

@synthesize property 讓系統(tǒng)幫我們生成set get 方法

@dynamic name; // 不讓系統(tǒng)生成get和set方法  需要我們自己去實(shí)現(xiàn)

插入數(shù)據(jù):

// 插入操作

- (void)insertData

{

    // 獲取到上下文對(duì)象

    AppDelegate *delegate = [UIapplication sharedApplication].delegate;

    NSManagedObjectContext *context = delegate.managedObjectContext;

    

    // 創(chuàng)建一個(gè)要插入的對(duì)象

    NSManagedObject *people = [NSEntityDescription insertNewObjectForEntityForName:@"People" inManagedObjectContext:context];

    [people setValue:@"王紅五" forKey:@"name"];

    [people setValue:@(28) forKey:@"age"];

    NSError *error = nil;

    // 執(zhí)行保存的方法, 就會(huì)把剛才創(chuàng)建的對(duì)象保存到數(shù)據(jù)庫(kù)中

    BOOL isSave = [context save:&error];

    if (isSave) {

        NSLog(@"insert success");

    }else

    {

        NSLog(@"insert failed %@",error);

    }

    

    // 方法二

    People *people1 = [NSEntityDescription insertNewObjectForEntityForName:@"People" inManagedObjectContext:context];

    people1.name = @"馬六六";

    people1.age = @21;

    NSError *error1 = nil;

    [context save:&error1];

    

    

}

 

查詢操作:

- (void)queryData

{

    // 獲取到上下文對(duì)象

    AppDelegate *delegate = [UIApplication sharedApplication].delegate;

    NSManagedObjectContext *context = delegate.managedObjectContext;

    // 創(chuàng)建一個(gè)查詢的請(qǐng)求

    NSFetchRequest *request = [[NSFetchRequest alloc]init];

    // 設(shè)置要查詢哪一個(gè)實(shí)體(表)

    request.entity = [NSEntityDescription entityForName:@"People" inManagedObjectContext:context];

    // 排序?qū)ο?/span>

    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];

    request.sortDescriptors = @[sort];

    // 查詢條件

    request.predicate = [NSPredicate predicateWithFormat:@"name like %@",@"*"];

    // 調(diào)用查詢的方法

    NSError *error = nil;

    NSArray *array = [context executeFetchRequest:request error:&error];

    for (People *p in array) {

        NSLog(@"name %@ age %@",p.name,p.age);

//        [self updateData:p];

        [self deleteData:p];

    }

}

 

修改(更新操作):

- (void)updateData: (People *)people

{

    // 修改具體的值

    people.age = @40;

    // 獲取到上下文對(duì)象

    AppDelegate *delegate = [UIApplication sharedApplication].delegate;

    NSManagedObjectContext *context = delegate.managedObjectContext;

    NSError *error = nil;

    BOOL isOk = [context save:&error];

    NSLog(@"%@",isOk == YES?@"保存成功":@"保存失敗");

}

 

刪除操作:

- (void)deleteData: (People *)people

{

    // 獲取到上下文對(duì)象

    AppDelegate *delegate = [UIApplication sharedApplication].delegate;

    NSManagedObjectContext *context = delegate.managedObjectContext;

    [context deleteObject:people];

    BOOL isOK = [context save:nil];

    NSLog(@"%@",isOK == YES?@"刪除成功":@"刪除失敗");

}



說(shuō)到這里,整個(gè)Core Data框架的入門就結(jié)束了,其實(shí)Core Data還遠(yuǎn)不止這些功能,它還支持自動(dòng)撤銷機(jī)制,一對(duì)多關(guān)聯(lián)等,這里就不一一介紹了

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 东兴市| 阿拉尔市| 耿马| 鹤庆县| 嘉荫县| 澄城县| 莱芜市| 双辽市| 益阳市| 兖州市| 胶南市| 始兴县| 库尔勒市| 宜章县| 岑巩县| 邻水| 神池县| 石台县| 山阴县| 盈江县| 澎湖县| 通州市| 新龙县| 昌吉市| 沙雅县| 大悟县| 锡林郭勒盟| 南京市| 新安县| 城步| 宣威市| 商水县| 文登市| 昂仁县| 镇原县| 子洲县| 东阿县| 宁国市| 阜阳市| 根河市| 华蓥市|