demo資源連結
功能介紹
CoreData核心資料庫,是cocoa架構中得一個用于管理資料庫和對象之間映射關系的一套支援庫,它主要提供ORM(對象關系映射)功能,可以将OC對象轉化為資料,儲存在本地資料庫也可以将資料庫中的資料還原成OC對象,極大的簡化了操作.CoreData不僅支援SQLite資料庫還支援XML,記憶體和二進制檔案的儲存
庫檔案
CoreData.framework
涉及類
類名 | 所屬庫 | 功能 |
---|---|---|
NSManaged Object Model | CoreData | 描述應用程式的資料模型,這個模型包含實體(Entity),特性(Property),讀取請求 |
NSManaged Object Context | CoreData | 參與對資料對象進行操作的全過程,并檢測資料對象的變化,以提供對undo/redo的支援及更新綁 定到資料的UI. |
NSManaged Object | CoreData | 資料對象,用于儲存從資料庫獲得的資料,與ManagedObjectContext關聯. |
NSPersisterStore Coordinator | CoreDara | 資料檔案管理器,用于處理對資料庫的增删改查操作.一般不需要對這個類進行操作. |
NSEntityDescription | CoreData | 表實體結構,管理表的結構,從表結構中建立實體類 |
NSSortDescriptor | Foundation | 負責管理查詢資料時,資料的排列方式 |
NSFetchRequest | CoreData | 查詢結果集,主要用于查詢資料,并傳回結果,可以設定查詢條件和查詢順序 |
NSPredicate | Foundation | 謂詞條件,使用謂詞來為FetchRuquest設定查詢條件 |
建立資料庫模型檔案
- 1.選擇模闆
-
IOS-Coredata 核心資料庫的基礎使用
Command + N打開建立檔案視窗,選擇Core Data目錄中的Data Model然後Next
- 2.建立模型實體
-
IOS-Coredata 核心資料庫的基礎使用
這裡建立了一個名叫People的執行個體資料庫,裡面有兩個字段age和name分别是整型和字元串類型的
使用代碼對資料庫進行操作
- 1.編寫代碼建立上下文
- 建立一個繼承與NSObjcet的類,建立一個NSManagedObjectContext屬性,命名為ManagedObjectContext
- (instancetype)init{
self = [super init];
if (self) {
//擷取資料庫模型的本地url Model.xcdatamodeld編譯後的字尾為momd;
NSURL * modelUrl = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
//建立模型對象,從資料庫模型中建立對象
NSManagedObjectModel * model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelUrl];
//建立檔案管理器管理模型對象.
NSPersistentStoreCoordinator * store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
//設定資料庫檔案儲存的路徑,字尾為sqlite
NSURL * dataURL = [[[[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]URLByAppendingPathComponent:@"mySQL.sqlite"];
NSError * error = nil;
//生成本地資料庫檔案,并設定生成檔案的類型為SQLite
[store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:dataURL options:nil error:&error];
if (error) {
NSLog(@"建立資料庫失敗!");
abort();
}else{
//生成檔案成功,建立用于操作資料庫的上下文
_managerObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
//設定上下文操作的資料庫管理器,不需要直接操作PersistentStoreCoordinator,我們隻要操作上下文就可以對資料庫進行增删改查.
[_managerObjectContext setPersistentStoreCoordinator:store];
}
}
return self;
}
- 2.為資料庫添加一條資料
//增
- (void)addPeopleObjectWithPeopleName:(NSString *)name peopleAge:(NSNumber *)age{
//根據People實體模型建立一個新的People對象,并加入上下文管理
NSManagedObject * people = [NSEntityDescription insertNewObjectForEntityForName:@"People" inManagedObjectContext:_managerObjectContext];
//設定people的屬性
[people setValue:name forKey:@"name"];
[people setValue:age forKey:@"age"];
//同步資料到本地資料庫.這裡要注意下,即使沒有儲存到本地,依然能查找到這個條目,隻不過APP下次運作就沒有了.
if([_managerObjectContext save:nil]){
NSLog(@"儲存資料成功!");
}
}
- 3.查詢資料,資料排序
//按照年齡排序并查找年齡小于1的條目
- (NSArray *)sortPeopleWithAge{
//建立一個結果集
NSFetchRequest * request = [[NSFetchRequest alloc] init];
//設定結果集所對應的實體和上下文,這裡表示查詢People實體内的資料, 這裡的People要和模型檔案中得實體名稱相同
request.entity = [NSEntityDescription entityForName:@"People" inManagedObjectContext:_managerObjectContext];
//建立一個排序規則,按照age進行升序排列
NSSortDescriptor * sort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
//可以添加多個排序規則
request.sortDescriptors = @[sort];
//添加謂詞,為查找指定條件為 age屬性大于1的條目
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"age > 1"];
request.predicate = predicate;
//擷取查找結果
NSArray * array = [_managerObjectContext executeFetchRequest:request error:nil];
return array;
}
- 4.修改資料
//改
- (NSManagedObject *)updatePeopleName:(NSString *)name toNewName:(NSString *)newName{
//查找要修改的資料條目
NSManagedObject * people = [self peopleObjectWithName:name];
//修改屬性
[people setValue:newName forKey:@"name"];
//同步儲存到本地資料庫
[_managerObjectContext save:nil];
return people;
}
- 5.删除一條資料
//删
- (void)deletePeopleObjectWithName:(NSString *)name{
//查找要删除的資料條目
NSManagedObject * people = [self peopleObjectWithName:name];
//删除條目
[_managerObjectContext deleteObject:people];
//同步儲存到本地資料庫
if([_managerObjectContext save:nil]){
NSLog(@"删除成功!");
}
}
注:在使用context儲存之前所做的更改如:建立新的對象,删除對象,修改對象屬性,一樣會影響FetchRequest查找到的資料,但是不會影響本地儲存的資料,[context save]方法的作用是将程式記憶體中所有的資料庫資料同步儲存到本地.可以使用[context hasChange]方法來判斷本地資料和記憶體中的資料是否一緻.