CoreData簡介
Core Data
提供了對象-關(guān)系映射(ORM)的功能唬党,即能夠?qū)C對象轉(zhuǎn)化成數(shù)據(jù)鹃共,保存在SQLite數(shù)據(jù)庫文件中,也能夠?qū)⒈4嬖跀?shù)據(jù)庫中的數(shù)據(jù)還原成OC對象驶拱。在此數(shù)據(jù)操作期間霜浴,我們不需要編寫任何SQL語句。
特點:
1蓝纲、可視化阴孟,且具有undo/redo能力
2、可以實現(xiàn)多種文件格式:
* NSSQLiteStoreType SQLite
* NSBinaryStoreType Binary
* NSInMemoryStoreType 內(nèi)存存儲
* NSXMLStoreTyp XML
CoreData 核心類與結(jié)構(gòu)
NSManagedObjectContext
(托管對象上下文)
指定隊列
_managedObjectContext = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType];
指定協(xié)調(diào)器
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
作用:插入税迷、查詢温眉、刪除、更新數(shù)據(jù)翁狐。
NSPersistentStoreCoordinator
(持久化協(xié)調(diào)器)
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]
作用:相當于數(shù)據(jù)庫的連接器类溢;
設置數(shù)據(jù)存儲的名字,位置露懒,存儲方式闯冷,和存儲時機
NSManagedObjectModel
(對象映射模型)
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
作用:添加實體的屬性,建立屬性之間的關(guān)系
操作方法:視圖編輯器懈词,或代碼
NSManagedObject
(托管對象)
CoreData 創(chuàng)建步驟:
1.創(chuàng)建模型文件 [相當于一個數(shù)據(jù)庫]
2.添加實體 [一張表]
3.創(chuàng)建實體類 [相當模型--表結(jié)構(gòu)]
4.生成上下文 關(guān)聯(lián)模型文件生成數(shù)據(jù)庫
簡要截圖:
1.創(chuàng)建模型文件:
**2.添加實體 **:
3.創(chuàng)建實體類:
- 方法1 (酌情使用)
自己創(chuàng)建相應類并繼承 NSManagedObject 使用:
這里需要注意的是,自己創(chuàng)建的類名不能和CoreData中的實體(Entity)重名坎弯,否則會報錯纺涤。
比如译暂,下面的代碼Employee類就會與上圖的Employee 實體沖突。所以要換成不同的名字撩炊,最后關(guān)聯(lián)二者則需要insertNewObjectForEntityForName: inManagedObjectContext: 方法
外永。例如改為Person后的代碼:
Person * p = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:_context];
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface Employee : NSManagedObject //要換個名字
@property (nonatomic ,strong)NSDate *birthDay;
@property (nonatomic ,assign)float height;
@property (nonatomic ,copy)NSString *name;
@end
- 方法2 (Tools Version: Xcode8.0 ; Codegen: Class Definition)推薦使用。
Xcode8 在創(chuàng)建Entity后拧咳,應該會自動創(chuàng)建以前版本中NSManageObject subclass
選項創(chuàng)建的兩個類別文件伯顶。所以這里我們可以直接#import
使用(在文件夾中我沒有找到相應文件)。
這個方法如果想向+CoreDataClass 骆膝、 +CoreDataProperties
文件中添加代碼祭衩,我是分別import
相應文件,command能夠進入文件添加代碼阅签。
懷疑是Xcode的bug掐暮,但也有可能是Xcode覺得顯示出文件太多了,等后續(xù)版本政钟。
- 方法3 (Tools Version: Xcode7.3 或 Tools Version: Xcode8.0劫乱; Codegen: Class Definition )
Xcode8 之后新建文件Core Data一欄只剩了兩個,NSManageObject subclass不翼而飛锥涕。若想還是要用它:
注意: 我的Xcode8 中會有.CoreDataClass文件
的重復沖突報錯,不知是否是其bug狭吼。
解決辦法為:選中你的xcdatamodeld文件层坠,點擊相應Entity ,在右側(cè)設置Tools Version選擇 Xcode7.3
刁笙。
選中你的xcdatamodeld文件破花,點擊導航欄的Editor
,選擇Create NSManagedObject Subclass
...然后就是下一步疲吸、下一步座每。。摘悴。峭梳。創(chuàng)建完成的結(jié)果如圖:
1.創(chuàng)建出的實體文件默認語言貌似是Swift的,想要OC版的小伙伴只需要選中你的xcdatamodeld文件蹂喻,點擊相應Entity選擇對應語言再創(chuàng)建NSManageObject subclass即可葱椭!
4.生成上下文 關(guān)聯(lián)模型文件生成數(shù)據(jù)庫
簡要代碼實現(xiàn):
//1、創(chuàng)建模型對象
//獲取模型路徑
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"company" withExtension:@"momd"];
//根據(jù)模型文件創(chuàng)建模型對象
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
//2口四、創(chuàng)建持久化助理
//利用模型對象創(chuàng)建助理對象
NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
//數(shù)據(jù)庫的名稱和路徑
NSString *docStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *sqlPath = [docStr stringByAppendingPathComponent:@"mySqlite.sqlite"];
NSLog(@"path = %@", sqlPath);
NSURL *sqlUrl = [NSURL fileURLWithPath:sqlPath];
//設置數(shù)據(jù)庫相關(guān)信息
[store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:sqlUrl options:nil error:nil];
//3孵运、創(chuàng)建上下文
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
//關(guān)聯(lián)持久化助理
[context setPersistentStoreCoordinator:store];
_context = context;
}
關(guān)于CoreData升級
Xcode8.0以前版本,如果iOS App 使用到CoreData蔓彩,并且在上一個版本上有數(shù)據(jù)庫更新(新增表治笨、字段等操作)驳概,那在覆蓋安裝程序時就要進行CoreData數(shù)據(jù)庫的遷移。具體操作如下:ios修改了coredata數(shù)據(jù)結(jié)構(gòu)后旷赖,更新安裝會閃退
現(xiàn)在顺又,
用上文中提到的方法二創(chuàng)建的CoreData,(Tools Version: Xcode8.0 ; Codegen: Class Definition)。無論是新增表杠愧、字段等操作待榔,Xcode會自動更新,不會出現(xiàn)崩潰問題流济。所以以后就用方法二做CoreData吧~~