iOSCoreData(一)增刪改查

NO IMAGE

Core Data是iOS5之後才出現的一個框架,提供了直接使用SQLite數據庫的大部分靈活性,它提供了對象-關係映射(ORM)的功能,即能夠將OC對象轉化成數據,保存在SQLite數據庫文件中,也能夠將保存在數據庫中的數據還原成OC對象,通過CoreData管理應用程序的數據模型,可以極大程度減少需要編寫的代碼數量!

示例Demo:CoreDataLearn

iOSCoreData(一)增刪改查

1、首先創建一個coreData 模型文件:系統創建或者自己創建

iOSCoreData(一)增刪改查

iOSCoreData(一)增刪改查

2、在data Model 中創建項目中需要用到的實體(Entities),例如,創建一個Student 實體(第一字母必須是大寫),以及添加一些name、age、sex 等屬性,如下圖

iOSCoreData(一)增刪改查

3、生成對應實體的實體類,在此之前要注意下圖兩個設置部分,否則會引起崩潰現象

iOSCoreData(一)增刪改查

iOSCoreData(一)增刪改查

iOSCoreData(一)增刪改查

iOSCoreData(一)增刪改查

iOSCoreData(一)增刪改查

4、生成上下文 關聯數據庫

  • NSManagedObjectContext 管理對象,上下文,持久性存儲模型對象,處理數據與應用的交互
  • NSManagedObjectModel 被管理的數據模型,數據結構
  • NSPersistentStoreCoordinator 添加數據庫,設置數據存儲的名字,位置,存儲方式
  • NSManagedObject 被管理的數據記錄
  • NSFetchRequest 數據請求
  • NSEntityDescription 表格實體結構
①、自己創建模型文件時需要以下代碼來手動生成上下文,關聯數據庫
//創建數據庫
- (void)createSqlite{
//1、創建模型對象
//獲取模型路徑
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
//根據模型文件創建模型對象
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
//2、創建持久化存儲助理:數據庫
//利用模型對象創建助理對象
NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
//數據庫的名稱和路徑
NSString *docStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *sqlPath = [docStr stringByAppendingPathComponent:@"coreData.sqlite"];
NSLog(@"數據庫 path = %@", sqlPath);
NSURL *sqlUrl = [NSURL fileURLWithPath:sqlPath];
NSError *error = nil;
//設置數據庫相關信息 添加一個持久化存儲庫並設置類型和路徑,NSSQLiteStoreType:SQLite作為存儲庫
[store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:sqlUrl options:nil error:&error];
if (error) {
NSLog(@"添加數據庫失敗:%@",error);
} else {
NSLog(@"添加數據庫成功");
}
//3、創建上下文 保存信息 對數據庫進行操作
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
//關聯持久化助理
context.persistentStoreCoordinator = store;
_context = context;
}
②、系統創建模型文件時會自動生成關聯數據庫的代碼,在iOS10以下和iOS10之後生成的不一樣,出現了一個新類NSPersistentContainer。

NSPersistentContainer是一個容器,封裝了應用程序中的CoreData Stack(核心數據棧堆),簡化了創建和管理的核心堆棧的數據處理創建NSManagedObjectModel,NSPersistentStoreCoordinator,NSManagedObjectContext。詳情可以看看這篇文章:blog.csdn.net/u013263917/…

iOSCoreData(一)增刪改查

iOSCoreData(一)增刪改查

iOSCoreData(一)增刪改查


AppDelegate * appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
NSPersistentContainer * container = appDelegate.persistentContainer;
//返回沙盒中存儲數據庫的文件夾URL路徑,這是一個靜態方法,表示數據庫的文件路徑是唯一的
NSURL * url = [NSPersistentContainer defaultDirectoryURL];
NSManagedObjectContext *viewContext = container.viewContext;
NSManagedObjectModel *managedObjectModel = container.managedObjectModel;
NSPersistentStoreCoordinator *persistentStoreCoordinator = container.persistentStoreCoordinator;
//使用存儲調度器快速在多線程中操作數據庫,效率非常高(比主線程操作塊50倍!!!)
- (void)performBackgroundTask:(void (^)(NSManagedObjectContext *))block;

5.增刪改查排

  • 寫入數據
  // 1.根據Entity名稱和NSManagedObjectContext獲取一個新的繼承於NSManagedObject的子類Student
Student * student = [NSEntityDescription  insertNewObjectForEntityForName:@"Student"  inManagedObjectContext:_context];
//2.根據表Student中的鍵值,給NSManagedObject對象賦值
student.name = [NSString stringWithFormat:@"Mr-%d",arc4random()%100];
student.age = arc4random()%20;
student.sex = arc4random()%2 == 0 ?  @"美女" : @"帥哥" ;
student.height = arc4random()%180;
student.number = arc4random()%100
//   3.保存插入的數據
NSError *error = nil;
if ([_context save:&error]) {
[self alertViewWithMessage:@"數據插入到數據庫成功"];
}else{
[self alertViewWithMessage:[NSString stringWithFormat:@"數據插入到數據庫失敗, %@",error]];
}
  • 刪除數據
- (void)deleteData{
//創建刪除請求
NSFetchRequest *deleRequest = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
//刪除條件
NSPredicate *pre = [NSPredicate predicateWithFormat:@"age < %d", 10];
deleRequest.predicate = pre;
//返回需要刪除的對象數組
NSArray *deleArray = [_context executeFetchRequest:deleRequest error:nil];
//從數據庫中刪除
for (Student *stu in deleArray) {
[_context deleteObject:stu];
}
NSError *error = nil;
//保存--記住保存
if ([_context save:&error]) {
[self alertViewWithMessage:@"刪除 age < 10 的數據"];
}else{
NSLog(@"刪除數據失敗, %@", error);
}
}
  • 更新修改
//更新,修改
- (void)updateData{
//創建查詢請求
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
NSPredicate *pre = [NSPredicate predicateWithFormat:@"sex = %@", @"帥哥"];
request.predicate = pre;
//發送請求
NSArray *resArray = [_context executeFetchRequest:request error:nil];
//修改
for (Student *stu in resArray) {
stu.name = @"且行且珍惜_iOS";
}
//保存
NSError *error = nil;
if ([_context save:&error]) {
[self alertViewWithMessage:@"更新所有帥哥的的名字為“且行且珍惜_iOS”"];
}else{
NSLog(@"更新數據失敗, %@", error);
}  
}
  • 讀取查詢
//讀取查詢
- (void)readData{
/* 謂詞的條件指令
1.比較運算符 > 、< 、== 、>= 、<= 、!=
例:@"number >= 99"
2.範圍運算符:IN 、BETWEEN
例:@"number BETWEEN {1,5}"
@"address IN {'shanghai','nanjing'}"
3.字符串本身:SELF
例:@"SELF == 'APPLE'"
4.字符串相關:BEGINSWITH、ENDSWITH、CONTAINS
例:  @"name CONTAIN[cd] 'ang'"  //包含某個字符串
@"name BEGINSWITH[c] 'sh'"    //以某個字符串開頭
@"name ENDSWITH[d] 'ang'"    //以某個字符串結束
5.通配符:LIKE
例:@"name LIKE[cd] '*er*'"   //*代表通配符,Like也接受[cd].
@"name LIKE[cd] '???er*'"
*注*: 星號 "*" : 代表0個或多個字符
問號 "?" : 代表一個字符
6.正則表達式:MATCHES
例:NSString *regex = @"^A.+e$"; //以A開頭,e結尾
@"name MATCHES %@",regex
注:[c]*不區分大小寫 , [d]不區分發音符號即沒有重音符號, [cd]既不區分大小寫,也不區分發音符號。
7. 合計操作
ANY,SOME:指定下列表達式中的任意元素。比如,ANY children.age < 18。
ALL:指定下列表達式中的所有元素。比如,ALL children.age < 18。
NONE:指定下列表達式中沒有的元素。比如,NONE children.age < 18。它在邏輯上等於NOT (ANY ...)。
IN:等於SQL的IN操作,左邊的表達必須出現在右邊指定的集合中。比如,name IN { 'Ben', 'Melissa', 'Nick' }。
提示:
1. 謂詞中的匹配指令關鍵字通常使用大寫字母
2. 謂詞中可以使用格式字符串
3. 如果通過對象的key
path指定匹配條件,需要使用%K
*/
//創建查詢請求
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
//查詢條件
NSPredicate *pre = [NSPredicate predicateWithFormat:@"sex = %@", @"美女"];
request.predicate = pre;
// 從第幾頁開始顯示
// 通過這個屬性實現分頁
//request.fetchOffset = 0;
// 每頁顯示多少條數據
//request.fetchLimit = 6;
//發送查詢請求
NSArray *resArray = [_context executeFetchRequest:request error:nil];
[self alertViewWithMessage:@"查詢所有的美女"];  
}
  • 排序
//排序
- (void)sort{
//創建排序請求
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
//實例化排序對象
NSSortDescriptor *ageSort = [NSSortDescriptor sortDescriptorWithKey:@"age"ascending:YES];
NSSortDescriptor *numberSort = [NSSortDescriptor sortDescriptorWithKey:@"number"ascending:YES];
request.sortDescriptors = @[ageSort,numberSort];
//發送請求
NSError *error = nil;
NSArray *resArray = [_context executeFetchRequest:request error:&error];
if (error == nil) {
[self alertViewWithMessage:@"按照age和number排序"];
}else{
NSLog(@"排序失敗, %@", error);
}
}
CoreData調試:

打開Product,選擇Edit Scheme.
選擇Arguments,在下面的ArgumentsPassed On Launch中添加下面兩個選項,如圖:
(1)-com.apple.CoreData.SQLDebug
(2)1

iOSCoreData(一)增刪改查

示例Github:CoreDataLearn

如果需要跟我交流的話:
※ Github: github.com/wsl2ls
※ 個人博客:wsl2ls.github.io
※ 簡書:www.jianshu.com/u/e15d1f644…
※ 微信公眾號:iOS2679114653
※ QQ:1685527540

相關文章

UIScrollView視覺差動畫

iOS封裝原生二維碼掃描和生成

iOS傳感器集錦

iOSCoreData(二)版本升級和數據庫遷移