zoukankan      html  css  js  c++  java
  • 数据库CoreData (2)

     一、创建步骤

    这一节主要是讲解使用coreData进行数据的绑定,就是两个表之间的联系。创建过程如下:

    (1)创建Model(上一次有提到创建过程)

    (2)命名(可以默认)

    (3)添加数据库。

    (4)创建列表(表名开头大写)并添加属性。注意属性的类型(Integer、string等)

    (5)同理设置Card。

    (6)给两个表添加外在的联系。Relationship要选择另一个表中的与本表相联系的属性。(Person中的cardID与Card中的number)

    (7)同上。

    (8)另外,还需要添加以下内容。【-com.apple.CoreData.SQLDebug】【1

    以上步骤结束之后,完成创建。添加模型。

    (1)

    (2)勾选创建的数据库

    (3)选择创建联系的两个表。

    (4)如此之后,会生成两个类

    (5)在Person.h中的代码如下

     1 #import <Foundation/Foundation.h>
     2 #import <CoreData/CoreData.h>
     3 
     4 @class Card;
     5 
     6 @interface Person : NSManagedObject
     7 
     8 @property (nonatomic, retain) NSString * name;
     9 @property (nonatomic, retain) NSNumber * age;
    10 @property (nonatomic, retain) NSNumber * cardID;
    11 @property (nonatomic, retain) Card *number;
    12 
    13 @end

    在Person.m中的代码如下

     1 #import "Person.h"
     2 #import "Card.h"
     3 
     4 @implementation Person
     5 
     6 @dynamic name;
     7 @dynamic age;
     8 @dynamic cardID;
     9 @dynamic number;
    10 
    11 @end

    在Card.h中的代码如下

    1 #import <Foundation/Foundation.h>
    2 #import <CoreData/CoreData.h>
    3 
    4 @interface Card : NSManagedObject
    5 
    6 @property (nonatomic, retain) NSNumber * number;
    7 @property (nonatomic, retain) NSManagedObject *cardID;
    8 
    9 @end

    在Card.m中的代码如下

    1 #import "Card.h"
    2 
    3 @implementation Card
    4 
    5 @dynamic number;
    6 @dynamic cardID;
    7 
    8 @end

    可以看出,自动生成的代码已经有了各自的属性,并有了链接。需要强调的一点是,如果先给Person链接,那么在Person.h中就是 Card *number;反之,则是 在Card中 Person *cardID。两者不同。读者可以自己试验。

    二、代码实现

    为了使用方便,将增删查的方法进行了封装。

     1 //单例
     2 + (instancetype)shareInstancetype;
     3 
     4 
     5 //读取数据文件
     6 /*
     7  *      modelName:模型文件的名称
     8  */
     9 - (void)loadDataBase:(NSString *)modelName;
    10 
    11 //添加数据
    12 /*
    13  *      entityName:实体名称
    14  *          params:@{key(试题中的属性名):value(需要存储的数据)}
    15  *
    16  */
    17 - (NSManagedObject *)insertEntity:(NSString *)entityName withParams:(NSDictionary *)params;
    18 
    19 
    20 //查询数据
    21 /*
    22  *      entityName:实体名称
    23  *       predicate:查询条件
    24  *           sorts:排序字符串数组
    25  */
    26 - (NSArray *)queryWithEntity:(NSString *)entityName withPredicate:(NSString *)predicate withSortDescriptor:(NSArray *)sorts;
    27 
    28 //删除数据
    29 /*
    30  *      entityName:实体名称
    31  *       predicate:查询条件
    32  */
    33 - (void)deleteWithEntity:(NSString *)entityName withPredicate:(NSString *)predicate;

    具体实现的代码在上一篇中已经写过。只是有单例模式没有实现。

     1 //单例模式
     2 + (instancetype)shareInstancetype {
     3     //注意野指针
     4     static CoreDataManager *manager = nil;
     5     static dispatch_once_t onceToken;
     6     dispatch_once(&onceToken, ^{
     7         manager = [[CoreDataManager alloc] init];
     8     });
     9     return manager;
    10 }
    11 //重写init方法
    12 - (id)init {
    13     if (self = [super init]) {
    14         //判断其实可以不要
    15         if (!_context) {
    16             //在这里写这句代码是为了与下面的context进行绑定
    17             //初始化上下文本
    18             _context = [[NSManagedObjectContext alloc] init];
    19         }
    20     }
    21     return self;
    22 }

      dispatch_once_t 是一种多线程,多用在类方法中用来返回一个单例,检测每次调用时,block是否执行完毕,只初始化一次

      dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);

      该函数接收一个dispatch_once用于检查该代码块是否已经被调度的谓词(是一个长整型,实际上作为BOOL使用)。它还接收一个希望在应用的生命周期内仅被调度一次的代码块,对于本例就用于shared实例的实例化。dispatch_once不仅意味着代码仅会被运行一次,而且还是线程安全的,这就意味着你不需要使用诸如@synchronized之类的来防止使用多个线程或者队列时不同步的问题。

    看实际代码操作

    1 #import "ViewController.h"
    2 //导入头文件
    3 #import <CoreData/CoreData.h>
    4 #import "CoreDataManager.h"
    5 #import "Person.h"
    6 #import "Card.h"

    用button操作

     1 //创建数据库、表
     2 - (IBAction)createTable {
     3     [[CoreDataManager shareInstancetype] loadDataBase:@"Model"];
     4 }
     5 //添加数据
     6 - (IBAction)insert {
     7     NSDictionary *dic = @{@"name":@"马二蛋",@"age":@18,@"cardID":@2305};
     8     [[CoreDataManager shareInstancetype] insertEntity:@"Person" withParams:dic];
     9 }
    10 
    11 //查询数据
    12 - (IBAction)query {
    13     [[CoreDataManager shareInstancetype] queryWithEntity:@"Person" withPredicate:@" cardID = 2305 " withSortDescriptor:nil];
    14 }
    15 
    16 //删除数据
    17 - (IBAction)delet {
    18 
    19     [[CoreDataManager shareInstancetype] deleteWithEntity:@"Person" withPredicate:@"cardID = 2305"];
    20 }

    效果图

    文章为作者原著,转载请标明出处。欢迎读者找错。

  • 相关阅读:
    Git使用及关联远程仓库
    Ceres Solver
    Halcon手眼标定
    Halcon 3D定位方法
    机器学习-数学基础
    Halcon匹配方法
    手眼标定
    C动态内存分配
    Halcon Calibration Assistant
    Visualization
  • 原文地址:https://www.cnblogs.com/david-han/p/4883395.html
Copyright © 2011-2022 走看看