时间:北京时间20:54
关于CoreData,我们首先要说的就是他的三个结构:managedObjectContext,managedObjectModel,persistentStoreCoordinator
其实我个人认为他们三个的结构顺序是这样的:managedObjectContext --> persistentStoreCoordinator --> managedObjectModel
对以上的顺序做个解释:
✅:在创建managedObjectContext的时候,我们需要确定上下文操作的是哪个数据库,这里就是关系到持久话助理了,所以在创建上下文的时候,我们要
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
✅:在创建persistentStoreCoordinator的时候,我们要知道存储的数据模型的数据格式,相当于要知道是对哪张表操作,所以我们要
_persistentStoreCoordinator = [[NSPersistentStoreCoordinatoralloc]initWithManagedObjectModel:[selfmanagedObjectModel]];
然后是把数据真正存储进数据库里面,所以我们要创建数据库,用以存放我们刚才创建的表Model,跟底层交汇的代码。
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
}
✅:在创建managedObjectModel的时候,我们需要知道TestForCoreData.xcdatamodeld的名字就可以,找到URL,然后返回
_managedObjectModel
NSURL *modelURL = [[NSBundlemainBundle] URLForResource:@"TestForCoreData"withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModelalloc] initWithContentsOfURL:modelURL];
managedObjectContext:这是一个提供给用户操作的层,用户可以在这个层面上对存储做增,删,改,查的操作,其实在执行Save之前,都没有存进数据库。
if(![context save:&error]){
NSLog(@"Can't Save");
}
所以每次在对存储数据进行操作的时候,我们要做的第一件事情就是获取上下文Context对象。下面我们来介绍以下CoreData里面的增删改查。
CoreData增删改查:
1⃣️增:往实体ContactInfo增加一条表数据,首先要创建一个NSManageObject对象和获取Context对象,表示往表里面增加一条数据
NSManagedObjectContext *context = [self managedObjectContext];
NSManagedObject *contactInfo = [NSEntityDescription insertNewObjectForEntityForName:@"ContactInfo" inManagedObjectContext:context];
[contactInfo setValue:@"name B" forKey:@"name"];
[contactInfo setValue:@"age = 25" forKey:@"age"];
[contactInfo setValue:@"birthday = 1990" forKey:@"birthday"];
NSError *error;
if(![context save:&error]){
NSLog(@"Can't Save Data right now!");
}
2⃣️查:因为删除和修改的话,都是在查找到之后的操作,所以把查提前讲解。查除了需要Context之外,还需要 NSFetchRequest(查找条件) 对象,需要制定是查找那个实体,当用户执行完了 executeFetchRequest之后,会以数组的形式返回当前查找的结果,我们查看其中的属性(表中的属性)即可
NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"ContactInfo" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSError *error;
NSArray *fetchedObject = [context executeFetchRequest:fetchRequest error:&error];
for(NSManagedObject *info in fetchedObject){
NSLog(@"Info_name : %@",[info valueForKey:@"name"]);
NSLog(@"Info_age : %@",[info valueForKey:@"age"]);
}
3⃣️删:删除之前,我们先要查找到需要删除的对象,先执行查找,基本和上面是一样的
NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"ContactInfo" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSError *error;
NSArray *fetchedObject = [context executeFetchRequest:fetchRequest error:&error];
然后开始执行删除代码:
if(!([fetchedObject count] == 0)){
[context deleteObject:[fetchedObject lastObject]];
}
最后是将做过删除后的操作的数据进行存储:
if(![context save:&error]){
NSLog(@"Can't Save Data right now!");
}
4⃣️改:改也是在查的基础之上的操作,我们先要查找到需要被修改的object,然后用KVC对他的数据进行修改即可,先查找:
NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"ContactInfo" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSError *error;
NSArray *fetchedObject = [context executeFetchRequest:fetchRequest error:&error];
然后就是对其中的一项object进行修改:
[[fetchedObject objectAtIndex:0] setValue:@"50" forKey:@"age"];
[[fetchedObject objectAtIndex:0] setValue:@"Vicent" forKey:@"name"];
最后同样是对更新后的数据进行存储:
if(![context save:&error]){
NSLog(@"Can't Save");
}
觉得受用的请留下一个“赞”