東風不與周郎便,銅雀春深鎖二喬!<太陽珊瑚>
<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 數據庫的簡單操作:
.xcdatamodeld里:
- Add Entity 添加實體類
- 修改實體類名
- 修改屬性名與類型
- 創建文件 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保存到本地
//這個方法執行之后,本地數據才發生改變
NSErrorerror =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"];
//接收查詢數據
NSErrorerror =nil;
// 返回的是一個查詢結果的數組所以接收一下
NSArray*array = [self.objectContext executeFetchRequest:request error:&error];
//判斷error
if(error ==nil) {
//如果是,那就查到成功 可以放到dataArray里面然后去加載視圖顯示 可以通過謂詞按照你的需求去查找
NSLog(@"查找成功!");
}
------------------
多表的關聯
--------------




