接上篇文章莹汤,CoreData可視化創(chuàng)建和初始化(一)
可以自己創(chuàng)建一個(gè)tableView進(jìn)行數(shù)據(jù)展示,并進(jìn)行增刪改查操作
1.需要先獲取context 對(duì)象
AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = delegate.context;
2.插入數(shù)據(jù)
// 增加數(shù)據(jù)
- (void)insertData{
// 數(shù)據(jù)添加
NSArray *arr = @[@{@"name":@"張三",@"age":@22,@"stuId":@6},@{@"name":@"李四",@"age":@22,@"stuId":@12},@{@"name":@"王二",@"age":@22,@"stuId":@11}];
for (NSDictionary *dict in arr) {
Model *model = [[Model alloc] initWithDictionary:dict];
Student *student = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:self.context];
student.name = model.name;
student.stuId = model.stuId;
student.age = model.age;
NSError *error;
[self.context save:&error];
if (error) {
NSLog(@"插入數(shù)據(jù)錯(cuò)誤 %@",error);
}
}
}
3.查詢數(shù)據(jù)
// 查詢數(shù)據(jù)
- (void)fetchData{
// 查詢指令
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// 獲取要查詢的表單
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:self.context];
// 給查詢指令設(shè)置要查詢的表單
[fetchRequest setEntity:entity];
// 自定義要查詢的條件
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"stuId > %d",3];
// 給查詢指令設(shè)置查詢條件
[fetchRequest setPredicate:predicate];
// 給查詢進(jìn)行排序 升序
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"stuId" ascending:YES];
// 年齡 升序
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
// 按照在數(shù)組的位置读第,越靠前優(yōu)先級(jí)越高
NSArray *sortDescriptors = @[sortDescriptor1,sortDescriptor2];
// 給查詢指令設(shè)置排序條件
fetchRequest.sortDescriptors = sortDescriptors;
NSError *error;
// 可以隨意轉(zhuǎn)化成模型
NSArray *result = [self.context executeFetchRequest:fetchRequest error:&error];
if (error) {
NSLog(@"查詢失敗 %@",error);
}else{
NSMutableArray *arrM = [NSMutableArray array];
// for (NSInteger i = 0; i<result.count; i++) {
//// Student *student = result[i];
// Model *model = result[i];
// NSLog(@"%ld %@ %ld",(NSInteger)model.stuId,model.name,(NSInteger)model.age);
//// NSLog(@"%ld %@ %ld",(NSInteger)result[i].stuId,result[i].name,(NSInteger)result[i].age);
//
// }
// _modelList = arrM.copy;
for (Model *model in result) {
NSLog(@"%ld %@ %ld",(NSInteger)model.stuId,model.name,(NSInteger)model.age);
[arrM addObject:model];
}
_modelList = arrM.copy;
[self.tableView reloadData];
}
}
查詢時(shí)需要主要謂詞的用法
謂詞查詢條件:predicate
謂詞的條件指令
1.比較運(yùn)算符 > 曙博、< 、== 怜瞒、>= 羊瘩、<= 、!= 例:@"number >= 99"
2.范圍運(yùn)算符:IN 盼砍、BETWEEN 例:@"number BETWEEN {1,5}" @"address IN {'shanghai','nanjing'}"
3.字符串本身:SELF 例:@"SELF == 'APPLE'"
4.字符串相關(guān):BEGINSWITH尘吗、ENDSWITH、CONTAINS
例: @"name CONTAIN[cd] 'ang'"http://包含某個(gè)字符串
@"name BEGINSWITH[c] 'sh'" //以某個(gè)字符串開頭
@"name ENDSWITH[d] 'ang'" //以某個(gè)字符串結(jié)束
5.通配符:LIKE 例:@"name LIKE[cd] 'er'"http://代表通配符,Like也接受[cd].
@"name LIKE[cd] '???er'"
注: 星號(hào) "" : 代表0個(gè)或多個(gè)字符 問號(hào) "?" : 代表一個(gè)字符
6.正則表達(dá)式:MATCHES 例:NSString regex = @"^A.+e$"; //以A開頭浇坐,e結(jié)尾
@"name MATCHES %@",regex
注:[c]不區(qū)分大小寫 , [d]不區(qū)分發(fā)音符號(hào)即沒有重音符號(hào), [cd]既不區(qū)分大小寫睬捶,也不區(qū)分發(fā)音符號(hào)。
- 合計(jì)操作 ANY近刘,SOME:指定下列表達(dá)式中的任意元素擒贸。比如,ANY children.age < 18觉渴。
ALL:指定下列表達(dá)式中的所有元素介劫。比如,ALL children.age < 18案淋。
NONE:指定下列表達(dá)式中沒有的元素座韵。比如,NONE children.age < 18踢京。它在邏輯上等于NOT (ANY ...)誉碴。
IN:等于SQL的IN操作,左邊的表達(dá)必須出現(xiàn)在右邊指定的集合中瓣距。比如黔帕,name IN { 'Ben', 'Melissa', 'Nick' }。
提示: 1. 謂詞中的匹配指令關(guān)鍵字通常使用大寫字母
2. 謂詞中可以使用格式字符串
3. 如果通過對(duì)象的key path指定匹配條件蹈丸,需要使用%K
//創(chuàng)建查詢請(qǐng)求實(shí)例演示
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
//查詢條件
NSPredicate *pre = [NSPredicate predicateWithFormat:@"sex = %@", @"美女"]; r
equest.predicate = pre;
// 從第幾頁開始顯示
// 通過這個(gè)屬性實(shí)現(xiàn)分頁
//request.fetchOffset = 0;
// 每頁顯示多少條數(shù)據(jù)
//request.fetchLimit = 6;
//發(fā)送查詢請(qǐng)求 NSArray *resArray = [_context executeFetchRequest:request error:nil]; [self alertViewWithMessage:@"查詢所有的美女"];
4.刪除數(shù)據(jù)
// 刪除數(shù)據(jù)
- (void)deleteData{
// 先查找出要?jiǎng)h除的數(shù)據(jù)然后再刪除
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"stuId = 11"];
request.predicate = predicate;
NSArray *result = [self.context executeFetchRequest:request error:nil];
for (Student *obj in result) {
[self.context deleteObject:obj];
}
// 如果沒有save 的話成黄,數(shù)據(jù)庫并沒有真的刪掉數(shù)據(jù)呐芥,只是把你緩存的結(jié)果刪掉了
[self.context save:nil];
// 再次查找的話,并沒有從數(shù)據(jù)庫里查找奋岁,重啟應(yīng)用程序還是有的
[self fetchData];// 查看是否刪掉數(shù)據(jù)
}
5.修改數(shù)據(jù)
// 修改數(shù)據(jù)
- (void)updateData{
// 同刪除數(shù)據(jù)一樣贩耐,也要先查出要修改的數(shù)據(jù),然后再進(jìn)行修改
// 先查找出要?jiǎng)h除的數(shù)據(jù)然后再刪除
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"stuId = 7"];
request.predicate = predicate;
NSArray *result = [self.context executeFetchRequest:request error:nil];
for (Student *obj in result) {
obj.name = @"王二";
}
// 如果沒有save 的話厦取,數(shù)據(jù)庫并沒有真的刪掉數(shù)據(jù),只是把你緩存的結(jié)果刪掉了
[self.context save:nil];
// 再次查找的話管搪,并沒有從數(shù)據(jù)庫里查找虾攻,重啟應(yīng)用程序還是有的
[self fetchData];// 查看是否刪掉數(shù)據(jù)
}
// 調(diào)用刪除和更新操作
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
// [self deleteData];
[self updateData];
}
下篇文章會(huì)介紹CoreData的二次封裝,在實(shí)際開發(fā)中建議使用更鲁,可移植性很好霎箍,在項(xiàng)目中可以快速開發(fā)。