zoukankan      html  css  js  c++  java
  • iOS- CoreData 数据库管理利器!

    1.前文                              

    上次用SQLite3实现了数据管理,这次准备用CoreData来实现。

    Core Data 是iOS SDK 里的一个很强大的框架,允许程序员以面向对象的方式储存和管理数据。使用Core Data框架,程序员可以很轻松有效地通过面向对象的接口管理数据

    相比SQLite3来说,用CoreData更有利于程序员来管理数据,

    除了开头的准备工作略微繁琐点,后面的操作都很方便。

    而且在CoreData在数据操作过程中,无需编写任何SQL语句,这一点和JAVA里的hibernate框架类似。

    那么,下面我就直接说说它的实现步骤。

    2.CoreData实现的主要步骤                    

    2.1.要使用Core Data,首先需要导入CoreData框架                  

    表结构:NSEntityDescription

    表记录:NSManagedObject

    数据库存放方式:NSPersistentStoreCoordinator(持久化存储协调者)

    数据库操作:NSManagedObjectContext(被管理的对象上下文)

    2.2.接着要使用Code Data,首先需要定义模型文件,描述应用程序中的所有实体(Entities)

    2.3.创建连接数据库                                  

    1. 首先需要创建一个操作数据库的上下文。NSManagedObjectContext
    2. 操作数据库的上下文需要设置一个调度者属性,这个调度者是用来将图形化建立的模型和数据库联系起来。
    3. 给调度者添加一个需要联系的数据库。

      

     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] numberOfObjects];

                                                                  清澈Saup 

  • 相关阅读:
    西卡编程教学 C语言教学视频(共32课更新完毕) 『 西卡教学 』 西卡学院 Powered by Pureing Labs!
    大图片新闻的体验还是不错的
    分享:用php抓取网页内容方法总结
    “深圳文献港”昨日正式开通_综合新闻_财经_腾讯网
    分享:EJDB 1.0.37 发布,嵌入式 JSON 数据库引擎
    分享:MetaModel 3.2.5 发布,数据库元模型
    RQ: Simple job queues for Python
    分享:开源主机项目 Ouya 发布 SDK
    RQ 简单的任务队列 品牌控
    信息论、推理与学习算法(翻译版)
  • 原文地址:https://www.cnblogs.com/qingche/p/3512859.html
Copyright © 2011-2022 走看看