zoukankan      html  css  js  c++  java
  • 格而知之3:Core Data的基本使用

      最近准备做一个随手笔记类的app给自己用,考虑到从未使用过Core Data,就决定用Core Data来做数据存储。在网上参考了一些Core Data的资料后,用一天的时间写了这个demo,主要测试了增删改查,以及排序和分页这些基本功能。

      demo的代码可以在GitHub上下载:

      https://github.com/ShayneYeorg/Core-Data-Sample

    1、大致上,Core Data即是将数据库内容封装成了类和对象:

    (1)、一个数据库实例对应一个NSManagedObjectModel:根据苹果的官方文档,一个NSManagedObjectModel的实例表示程序中使用到的所有Entity的集合的提纲;

    (2)、一张数据库表对应成了一个Entity实例;

    (3)、数据库表中的每条记录对应一个NSManagedObject对象;

    (4)、记录里的每个字段就对应了NSManagedObject对象的每一个属性。

    它们之间的关系大致如下图:

    2、接下来开始新建项目,主要记得勾选上“Use Core Data”

     

    3、Xcode会在AppDelegate里面生成三个属性和若干方法,3个属性分别是:

    @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
    @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
    @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

    (1)、从1中已知NSManagedObjectModel的实例即可理解为一个数据库实例;

    (2)、NSManagedObjectContext是用来管理NSManagedObject的上下文,所有对NSManagedObject的实例的增删改查都要通过NSManagedObjectContext的实例来操作;

    (3)、而NSManagedObjectContext的实例在将NSManagedObject的增删改查等操作结果保存到持久化存储(persistent stores)中的时候,就需要通过NSPersistentStoreCoordinator的实例来做中间人(协调员),一个NSManagedObjectContext的实例如果没有NSPersistentStoreCoordinator的实例来协助,那它在功能上就是不完整的(not fully functional)。

    4、Entity需要手动建立。在项目中会生成一个xcdatamodeld后缀的文件,在这个文件的下方点击“Add Entity”,然后修改Entity的名称,以及添加属性:

     

    同时还要根据Entity的内容生成对应的类:新建文件,选择NSManagedObject subclass类文件,根据提示勾选上对应的Entity。

    那么就可以生成对应的类文件了,一个名为Article的Entity生成的类文件如下:

     

    Article+CoreDataProperties文件里就包含了刚才定义好的几个属性(表字段),Article可以用来添加一些对象操作的特定方法。

    5、接下来就是Core Data的基本增删改查操作,即是对Entity的增删改查操作。由于所有的操作都要通过NSManagedObjectContext的实例来操作,而Xcode已经在appDelegate里生成好了一个NSManagedObjectContext属性,此时要进行增删改查操作就要先把这个NSManagedObjectContext实例引进进来:

    ...
    @property (weak, nonatomic) AppDelegate *appDelegate;
    ...
    self.appDelegate = [[UIApplication sharedApplication] delegate];
    ...

    6、Core Data的增加操作:

    //新增数据
    - (void)addArticle {
        NSString *title = self.titleFiled.text;
        NSString *content = self.contentField.text;
    
        Article *article = [NSEntityDescription insertNewObjectForEntityForName:@"Article" inManagedObjectContext:self.appDelegate.managedObjectContext];
       
        article.title = title;
        article.content = [content dataUsingEncoding:NSUTF8StringEncoding];
        article.createTime = [NSDate date];
       
        NSError *error = nil;
        if ([self.appDelegate.managedObjectContext save:&error]) {
            if (error) NSLog(@"新增时发生错误:%@,%@",error,[error userInfo]);
        }
       
        [self.navigationController popViewControllerAnimated:YES];
    }

    7、Core Data的删除操作:

    //删除数据
    - (void)removeArticleFromDataSource:(Article *)article {
        [self.appDelegate.managedObjectContext deleteObject:article];
        NSError *error = nil;
        if(![self.appDelegate.managedObjectContext save:&error]) NSLog(@"删除数据时发生错误:%@,%@",error,[error userInfo]);
    }

     

    8、Core Data的修改操作:

    //修改数据:每个Entity实例都会有一个独一无二的objectID,通过这个来找到Entity实例
    - (void)alterArticle {
        Article *article = [self.appDelegate.managedObjectContext objectWithID:self.objectID];
        article.title = self.titleFiled.text;
        article.content = [self.contentField.text dataUsingEncoding:NSUTF8StringEncoding];
      
        NSError *error = nil;
        if ([self.appDelegate.managedObjectContext save:&error]) NSLog(@"修改成功");
       
        [self.navigationController popViewControllerAnimated:YES];
    }

     

    9、Core Data的查询操作:

    //查询数据
    - (NSMutableArray *)fetchArticlesFromDataSource {
        //request和entity,通过request来查询
        NSFetchRequest *request = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Article" inManagedObjectContext:self.appDelegate.managedObjectContext];
        [request setEntity:entity];
      
        //设置排序规则
        NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"createTime" ascending:NO];
        NSArray * sortDescriptors = @[sort];
        [request setSortDescriptors:sortDescriptors];
       
        //设置分页规则
        NSInteger offset = 0;
        NSInteger limit = 5;
        [request setFetchLimit:limit];
        [request setFetchOffset:offset];
     
        //设置查询条件
        NSString *str = [NSString stringWithFormat:@"title LIKE '*%@*'", searchStr];
        NSPredicate *pre = [NSPredicate predicateWithFormat:str];
        [request setPredicate:pre];
     
        //查询
        NSError *error = nil;
        NSMutableArray *articles = [[self.appDelegate.managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
        if (articles == nil) NSLog(@"查询所有数据时发生错误:%@,%@",error,[error userInfo]);
        return articles;
    }

    10、至此演示完Core Data的基本增删改查操作。

  • 相关阅读:
    STM32的DMA
    STM32 入门之 GPIO (zhuan)
    CRC校验码 代码
    actan函数 查表法
    UART 和 USART 的区别
    STM32的NVIC理解
    STM32_adc
    STM 32 can 实例代码
    在Visual C#中调用API的基本过程
    贴片电阻阻值标识
  • 原文地址:https://www.cnblogs.com/shayneyeorg/p/5181698.html
Copyright © 2011-2022 走看看