iOS激情詳解之Core Data
阿新 • • 發佈:2019-02-01
先了解一下 Core Data 它相當於封裝了sqlite
1.Core Data 是資料持久化儲存的最佳方式,一般資料最終的儲存型別可以是:SQLite資料庫,XML,二進位制,記憶體裡,或自定義資料型別.core Data儲存的路徑格式是URL型別 ,sqlite 儲存的路徑格式是 string型別,在Mac OS X 10.5Leopard及以後的版本中,開發者也可以通過繼承NSPersistentStore類以建立自定義的儲存格式
2,Core Data的好處:能夠合理管理記憶體,避免使用sql的麻煩,高效
3.構成:
(1)NSManagedObjectContext(被管理的資料上下文, 就是臨時資料庫增刪改查就是操作的臨時DB)
操作實際內容(操作持久層)
作用:插入資料,查詢資料,刪除資料
(2)NSManagedObjectModel(被管理的資料模型, 比如Student)
資料庫所有表格或資料結構,包含各實體的定義資訊
作用:新增實體的屬性,建立屬性之間的關係
操作方法:檢視編輯器,或程式碼
(3)NSPersistentStoreCoordinator(持久化儲存助理)
相當於資料庫的聯結器
作用:設定資料儲存的名字,位置,儲存方式,和儲存時機
(4)NSManagedObject(被管理的資料記錄)
相當於資料庫中的表格記錄
(5)NSFetchRequest(獲取資料的請求)
相當於查詢語句
(6)NSEntityDescription(實體結構)
相當於表格結構
(7)字尾為.xcdatamodeld的包
裡面是.xcdatamodel檔案,用資料模型編輯器編輯
<span style="font-size:18px;">// // ViewController.m // LessonCodeData // // Created by WDX on 15/10/9. // Copyright (c) 2015年 wangdongxu. All rights reserved. // #import "ViewController.h" #import "AppDelegate.h" #import "Student.h" @interface ViewController () #pragma mark - 屬性, 被管理物件上下文(臨時資料庫) @property (nonatomic, strong) NSManagedObjectContext *manmagerContext; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; } #pragma mark - 新增 - (IBAction)addData:(id)sender { // 建立實體描述 NSEntityDescription *studentED = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:self.manmagerContext]; for (int i = 0; i < 10; i++) { // 根據實體描述建立實體 Student *student = [[Student alloc] initWithEntity:studentED insertIntoManagedObjectContext:self.manmagerContext]; // 給實體賦值 student.name = [NSString stringWithFormat:@"東方紅%d號", i + 1]; student.age = [NSNumber numberWithInt:(18 + i)]; student.sex = [NSString stringWithFormat:@"男"]; } NSError *error = nil; // 資料同步 [self.manmagerContext save:&error]; if (!error) { NSLog(@"儲存成功"); } }</span>
<span style="font-size:18px;">#pragma mark - 查詢
- (IBAction)findData:(id)sender {
// 從實體中查詢
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Student"];
// 建立實體描述
NSEntityDescription *studentED = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:self.manmagerContext];
// 設定查詢實體
request.entity = studentED;
// 設定查詢根據key和BOOL進行升序降序排列,key為排列條件,YES為升序,NO是降序
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
request.sortDescriptors = @[sort];
// 設定查詢,根據指定條件查詢
// NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@", @"</span><pre name="code" class="objc"><span style="font-size:18px;">東方2號"];
// 模糊查詢,包含
// NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS %@", @"3"];
// 不知道的地方用*代替
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name LIKE %@",@"東方*"];
// 新增查詢條件
request.predicate = predicate;
// 陣列接收查詢的資料
NSArray *array = [self.manmagerContext executeFetchRequest:request error:nil];
// 遍歷陣列,取出資料列印
for (Student *student in array) {
NSLog(@"姓名:%@, 性別:%@, 年齡:%@", student.name, student.sex, student.age);
}
}
</span>
<span style="font-size:18px;">#pragma mark - 修改
- (IBAction)changeData:(id)sender {
// 先查詢
// 從實體中查詢
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Student"];
// 建立實體描述
NSEntityDescription *studentED = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:self.manmagerContext];
// 設定查詢實體
request.entity = studentED;
// 設定查詢,根據指定條件查詢
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS %@", @"5"];
// 新增查詢條件
request.predicate = predicate;
// 陣列接收查詢資料
NSArray *array = [self.manmagerContext executeFetchRequest:request error:nil];
// 遍歷
for (Student *student in array) {
student.sex = @"女";
student.age = [NSNumber numberWithInt:999];
NSLog(@"姓名:%@, 性別:%@, 年齡:%@", student.name, student.sex, student.age);
}
// 資料同步
NSError *error = nil;
// 資料同步
[self.manmagerContext save:&error];
if (!error) {
NSLog(@"修改成功");
}
}
</span>
<span style="font-size:18px;">#pragma mark - 刪除
- (IBAction)deleteData:(id)sender {
// 先查詢
// 從實體中查詢
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Student"];
// 建立實體描述
NSEntityDescription *studentED = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:self.manmagerContext];
// 設定查詢實體
request.entity = studentED;
// 設定查詢,根據指定條件查詢
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS %@", @"6"];
// 新增查詢條件
request.predicate = predicate;
// 陣列接收查詢資料
NSArray *array = [self.manmagerContext executeFetchRequest:request error:nil];
for (Student *student in array) {
// 刪除
[self.manmagerContext deleteObject:student];
}
// 資料同步
NSError *error = nil;
// 資料同步
[self.manmagerContext save:&error];
if (!error) {
NSLog(@"刪除成功");
}
}
#pragma mark - 被管理物件上下文(臨時資料庫)的懶載入方法
- (NSManagedObjectContext *)manmagerContext
{
if (!_manmagerContext) {
// 獲取AppDelegate當中的被管理物件上下文
_manmagerContext = ((AppDelegate *)[UIApplication sharedApplication].delegate).managedObjectContext;
}
return _manmagerContext;
}
@end</span>