iOS- CoreData 数据库管理

来源:互联网 发布:淘宝小铺名称能改吗 编辑:程序博客网 时间:2024/05/16 15:33
1.前文                              
Core Data 是iOS SDK 里的一个很强大的框架,允许程序员以面向对象的方式储存和管理数据。使用Core Data框架,程序员可以很轻松有效地通过面向对象的接口管理数据
 
除了开头的准备工作略微繁琐点,后面的操作都很方便。
 
而且在CoreData在数据操作过程中,无需编写任何SQL语句,这一点和JAVA里的hibernate框架类似。
 
2.CoreData实现的主要步骤                    
 
2.1.要使用Core Data,首先需要导入CoreData框架                  
 
表结构:NSEntityDescription
 
表记录:NSManagedObject
 
数据库存放方式:NSPersistentStoreCoordinator(持久化存储协调者)
 
数据库操作:NSManagedObjectContext(被管理的对象上下文)
 
2.2.接着要使用Code Data,首先需要定义模型文件,描述应用程序中的所有实体(Entities)
 
2.3.创建连接数据库                                  
 
首先需要创建一个操作数据库的上下文。NSManagedObjectContext
操作数据库的上下文需要设置一个调度者属性,这个调度者是用来将图形化建立的模型和数据库联系起来。
给调度者添加一个需要联系的数据库。
  
 1 // Merging合并可以将图形化建立的所有Model汇总到一个数据库文件中
 2     NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
 3     
 4     // 调度者的实例化,需要Model
 5     NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
 6     
 7     // 数据库是一个文件,持久化连接的文件
 8     NSError *error = nil;
 9     NSURL *url = [@"my.db" appendDocumentDirURL];
10     
11     // 添加持久化存储的数据库
12     [store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error];
13     
14     if (error == nil) {
15         NSLog(@"数据库建立成功");
16         
17         // 获取到数据库操作的上下文,类似于SQLite的句柄
18         _sharedContext = [[NSManagedObjectContext alloc] init];
19         
20         // 让上下文记录住存储调度
21         _sharedContext.persistentStoreCoordinator = store;
22     } else {
23         NSLog(@"数据库建立失败");
24     }
 
2.4.添加,更新,删除                                   
 
添加:
 
1.新建实体 INST (插入)
 
1    Person *p = [[Person alloc] init]
 
 
2.设置实体的属性
 
1 // 设置对象内容
2     person.name = _nameText.text;
3     person.phoneNo = _phoneText.text;
4     person.qq = _qqText.text;
5     person.weibo = _weiboText.text;
 
 
3.保存上下文
 
 
 1      //实体描述
 2      [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context]
 3 
 4     // 获取上下文
 5     NSManagedObjectContext *context = [[DataManager sharedDataManager] sharedContext];
 6 
 7     // 让上下文保存
 8     if ([context save:nil]) {
 9         NSLog(@"保存成功");
10         
11         // 返回上级视图控制器
12         [self.navigationController popViewControllerAnimated:YES];
13     } else {
14         NSLog(@"保存失败!");
15     }
 
 
 
 
 
更新:
 
1.判断是否已有一模一样的模型
 
 
    //判断
  Person *person = _editPerson;
 
    // 如果person == nil表示是新建用户
    if (person == nil) {
        person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
    }
 
 
 
2.设置实体属性
 
   person.name = _nameText.text;
    person.phoneNo = _phoneText.text;
    person.qq = _qqText.text;
    person.weibo = _weiboText.text;
 
 
3.保存上下文
 
 
1     // 让上下文保存
2     if ([context save:nil]) {
3         NSLog(@"保存成功");
4         
5         // 返回上级视图控制器
6         [self.navigationController popViewControllerAnimated:YES];
7     } else {
8         NSLog(@"保存失败!");
9     }
 
 
 
 
 
删除
 
// 1. 首先找到要删除哪条记录
        Person *person = 
 
 
 
 1 // 2. 删除
 2         NSManagedObjectContext *context = [[DataManager sharedDataManager] sharedContext];
 3         
 4         // 让上下文删除
 5         [context deleteObject:person];
 6         
 7         // 上下文保存
 8         if ([context save:nil]) {
 9             NSLog(@"删除成功!");
10         } else {
11             NSLog(@"删除失败!");
12         }
 
2.4.查询                                         
 
三.查询
 
1.使用NSFetchedResultsController控制器
 
// 查询结果控制器
    NSFetchedResultsController *_fetchedResultsController;
 
 
 2.监控managed object context对象的改变,报告给delegate
 
1  // 设置代理
2     _fetchedResultsController.delegate = self;
 
 
2.1当操作数据上下文的内容改变的时候,会自动调用抓取结果控制器的代理方法
 
1 #pragma mark 查询结果控制器代理方法
2 - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
3 {
4     // 新增、修改、删除
5     [self.tableView reloadData];
6 }
 
 
3.创建控制器
 
一般来说,你会创建一个NSFetchedResultsController实例作为tableview的成员变量。初始化的时候,你提供四个参数:
 
1。 一个fetchrequest.必须包含一个sortdescriptor用来给结果集排序。
 
2。 一个managedobject context。 控制器用这个context来执行取数据的请求。
 
3。 一个可选的keypath作为sectionname。控制器用keypath来把结果集拆分成各个section。(传nil代表只有一个section)
 
4。 一个cachefile的名字,用来缓冲数据,生成section和索引信息。
 
1  NSFetchRequest *reqest = _fetchedResultsController.fetchRequest;
 
 
 
1      1> 查询请求
2      2> 数据库上下文
3      3> 表格中用于分组的字段名
4      4> 缓存名称
5      */
6     _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];
 
  
5.注意:一定要执行抓取请求,返回的数据在sections里,这个数组中装的都是遵守NSFetchedResultsSectionInfo这个协议的对象。通过numberOfObjects就能获取一组有多少数据对象了。
 
1   return [_fetchedResultsController.sections[0] numberOfObjec
t
0 0