iOS基礎-CoreData--使用總結關聯操作

東風不與周郎便,銅雀春深鎖二喬!<太陽珊瑚>


  • <big>CoreData</big> 數據持久化框架是Cocoa API的一部分,它允許按照 實體-屬性-值 模型組織數據,并以XML(做MAC-os用), 二進制, 或者SQLite數據文件的格式持久化數據. CoreData主要提供 對象-關系映射(ORM)功能,把OC對象轉化為數據保存到文件,也可以數據轉化成OC對象.

  • CoreData與SQLite區別 :
  • CoreData是官方推出的數據持久化框架,SQLite是蘋果使用別人開發好的一個動態庫,本質是關系型數據庫.
  • CoreData是iOS平臺下的一個數據持久化的方式,不可以跨平臺使用,Sqlite可以跨平臺使用.
  • ---- CoreData -----
    1: 可視化,不用再寫 SQL 語句,大量簡化代碼.
    2: 可以實現多種文件格式 : NSSQLLiteStoreType, BSXMLStoreType 等
    3: 與iOS緊密結合, 只能用于開發iOS.
    4: 存儲內容, 以對象的形式存儲, 符合面向對象的思想.
  • ---- SQLite ----
    1: 是一個輕量級數據庫而且功能強大的關系型數據庫, 很容易被嵌入到應用當中, 可移植性高, 可以在多個平臺使用.
    2: 和CoreData 不一樣的是, SQLite 是使用程序式的.sql的主要操作方法,是直接操作數據
    3: 基于C接口, 使用SQL語句, 代碼繁瑣.
    4: 在處理大量數據時,表關系更直觀一些,
    5: OC中不是可視化的
  • 核心對象:

NSPersistentStoreCoordinator 數據連接器類(中間人,不能直接控制)
NSManagedObjectContext 數據管理器類 (臨時數據庫 )
NSManagedObject 數據管理類
NSManagedObject 數據模型器類
NSEntityDescription 實體描述類

  • NSManagedObjectContext (被管理的上下文)
    1: 操作實際內容 (對持久層的一個操作)
    2: 插入數據, 查詢數據, 刪除數據,修改數據
    3: 是我們開發中主要交互的類, 數據的CRUD都通過這個Context(上下文)去觸發命令并返回結果.
  • NSManagedObjectModel (被管理的數據模型)
    1: 包含了各個實體(表)的定義信息, 包含了表或者是數據庫的結構.
    2: 用來添加實體的屬性,建立屬性之間的關系.
    3: 操作方法: 視圖編輯器,也可以用代碼.
    4: 構建整個數據庫的表結構, 表字段類型, 表與表之間的關系等等, 凡是和數據結構有關系的定義, 通通都通過這個類來管理.

  • NSPersistentStoreCoordinator (持久化數據助理)
    1: 相當于數據庫的連接器
    2: 作用: 設置數據存儲的名字, 位置,存儲方式, 存儲時機.
    3: 原理: 從下層文件取出數據, 交給上層的被管理的對象上下文
    4: 實際上這個類才是真正意義上跟數據庫(.sqlite文件)打交道的,主要是根據 NSManagedObjectModel 執行表結構的建立通過 NSManagedObjectContext的命令執行數據交互.

  • 操作的思想流程:

context想要獲取值,先要告訴連接器,我要什么東西,連接器再告訴store,你給我什么東西,store去找,找到之后返回給context.

CoreData核心關系類

CoreData 數據庫的簡單操作:

.xcdatamodeld里:
  1. Add Entity 添加實體類
  1. 修改實體類名
  2. 修改屬性名與類型
  3. 創建文件 command+N —> CoreData —> NSManageObjuect subclass

一般使用的步驟:

// 導入CoreData框架
// 導入需要的類


#import <CoreData/CoreData.h>
#import "Person.h"
#import "AppDelegate.h"

第一步: 當前自身的數據庫連接器與APP的綁定

//通過單例的代理協議的代理人,獲取到我們最開始使用的 AppDelegate 

    AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate;
    
//獲得 數據庫的數據連接器 (定義一個`@property (nonatomic, strong) NSManagedObjectContext *objectContext;`)

    self.objectContext = app.managedObjectContext;
  • 向數據庫添加數據:

方式1:
/NSEntityDescription :實體描述類,通過類方法創建
//參數1 :表示這個實體描述類描述的是哪個實體
//參數2 :表示的是在context里創建一個描述,告訴context我要往里面插入以object了
NSEntityDescription *description = [NSEntityDescriptionentityForName:@"Person" inManagedObjectContext:self.objectContext];
//創建一個實體類
//參數1 :實體類描述
//參數2 :在context里放入這個類
Person person = [[Person alloc] initWithEntity:description insertIntoManagedObjectContext:self.objectContext];
方式2: 上面的兩步驟合并為一個步驟
/

Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.objectContext];
/
//把context保存到本地
//這個方法執行之后,本地數據才發生改變
NSError
error =nil;
[self.objectContext save:&error];
if(error ==nil)
{
NSLog(@"保存正確"); // 可以再次重新加載數據
}else
{
NSLog(@"錯誤%@",error);
}

- 刪除數據
>```code
// 獲取想要刪的數據 依情況而定
Person *person = self.dataArray[indexPath.row];      
// 在context中將這條數據刪除
  [self.objectContext deleteObject:person];
   NSError *error = nil; 
// 保存一下
  [self.objectContext save:&error];               
if (error == nil) { 
NSLog(@"刪除成功");
 }```

- 修改數據
>```code
  // 知道改誰  找到你要改的對象
    Person *person = self.dataArray[indexPath.row];
// 修改值    
int number = arc4random() % 2000;
person.name = [NSString stringWithFormat:@"%d 好", number];   
// 保存修改的東西到數據庫
NSError *error = nil;
[self.objectContext save:&error];
 if (error == nil) 
{ 
NSLog(@"修改成功了");
}   
  • 查詢數據

//創建一個查詢操作,查詢哪個表里的內容
NSFetchRequestrequest = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
//接收查詢數據
NSError
error =nil;
// 返回的是一個查詢結果的數組所以接收一下
NSArray*array = [self.objectContext executeFetchRequest:request error:&error];
//判斷error
if(error ==nil) {
//如果是,那就查到成功 可以放到dataArray里面然后去加載視圖顯示 可以通過謂詞按照你的需求去查找
NSLog(@"查找成功!");
}



------------------
多表的關聯
--------------

















![](http://upload-images.jianshu.io/upload_images/1523603-bb23784e6b24dd72.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/1523603-708c69d7eb4b4925.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)















![](http://upload-images.jianshu.io/upload_images/1523603-192a931d8284a4f8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)




![](http://upload-images.jianshu.io/upload_images/1523603-a10ba49d8614c0d0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)






![](http://upload-images.jianshu.io/upload_images/1523603-82d7510c0611d0b5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容