Coredata 单表简单使用

** 使用Coredata 工程中的DataModel建立:系统建立、手动建立**sql

** 使用Coredata须要要导入<CoreData/CoreData.h> **数据库

一、系统建立系统建立生成NSPersistentContainer, iOS10+,iPhoneX;iOS8+ 使用手动建立Coredata数组

1.1建立工程app

系统建立CoredataModel 图1

 

 

 

 

 

 

 

 

 

 

 

 

1.2 建立实体对象dom

建立实体对象

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.3 实体对象命名,Language属性值选择iphone

实体对象命名Language属性

 

 

 

 

 

 

 

 

 

 

 

1.4 实体对象属性codegen选择fetch

实体对象属性codegen选择

 

 

 

 

 

 

 

 

 

 

1.5 添加实体对象属性ui

添加实体对象属性

 

 

 

 

 

 

 

 

 

1.6 建立实体对象的子类文件url

建立实体对象子类文件

 

 

 

 

 

 

 

 

 

 

 

选择datamodel

 

 

 

 

 

 

 

 

 

 

 

 

 

选择实体对象

 

 

 

 

 

 

 

 

 

 

 

 

 

建立实体的子类文件图

 

 

 

 

 

 

 

1.7 建立NSManagedObject模型(模型命名不可和实体名称相同)spa

建立NSManagedObject模型

 

 

 

 

 

 

 

 

 

1.8为模型添加属性

为模型添加属性

 

 

 

 

 

 

 

 

 

 

为模型添加属性2

 

 

 

 

 

 

 

 

 

1.9 Viewcontroller.m (因为系统建立datamodel,系统已将coredata数据库初始化,无需本身初始化数据库)

 1 //
 2 //  ViewController.m
 3 //  Coredatanpp
 4 //
 5 //  Created by Z_小圣 on 2019/3/19.
 6 //  Copyright © 2019年 奶瓶瓶. All rights reserved.
 7 //
 8 
 9 #import "ViewController.h"
10 #import "BabyModal.h"
11 #import "AppDelegate.h"
12 @interface ViewController ()
13 {
14     NSManagedObjectContext *_context;
15     NSPersistentContainer *_container;
16     NSManagedObjectModel *_managedObjectModel;
17 }
18 @end
19 
20 @implementation ViewController
21 
22 - (void)viewDidLoad {
23     [super viewDidLoad];
24     AppDelegate * appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
25      _container = appDelegate.persistentContainer;
26     //返回沙盒中存储数据库的文件夹URL路径,这是一个静态方法,表示数据库的文件路径是惟一的
27     NSURL * url = [NSPersistentContainer defaultDirectoryURL];
28     NSLog(@"沙盒路径%@",url);
29     _context = _container.viewContext;
30     _managedObjectModel = _container.managedObjectModel;
31     // Do any additional setup after loading the view, typically from a nib.
32 }
33 //添加方法
34 - (IBAction)addAction:(UIButton *)sender {
35     // 1.建立一个新的继承于NSManagedObject的子类BabyModal
36     BabyModal *baby = [NSEntityDescription  insertNewObjectForEntityForName:@"Baby"  inManagedObjectContext:_context];
37 
38     //2.根据表Baby中的键值,给NSManagedObject对象赋值
39     baby.name = [NSString stringWithFormat:@"长江-%d",arc4random()%100];
40     baby.age = arc4random()%20;
41     baby.gender = arc4random()%2 == 0 ?  0: 1;
42     
43 //       3.保存插入的数据
44     NSError *error = nil;
45     if ([_context save:&error]) {
46         NSLog(@"数据插入到数据库成功");
47     }else{
48         NSLog(@"数据插入到数据库失败,%@",error);
49     }
50     
51 }
52 //查询方法
53 - (IBAction)queryAction:(UIButton *)sender {
54     
55     //建立查询请求
56     NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Baby"];
57     //查询条件
58     NSPredicate *pre = [NSPredicate predicateWithFormat:@"gender = %@", @"0"];
59     request.predicate = pre;
60     // 从第几页开始显示
61     // 经过这个属性实现分页
62     //request.fetchOffset = 0;
63     // 每页显示多少条数据
64     //request.fetchLimit = 6;
65     //发送查询请求
66     NSArray *resArray = [_context executeFetchRequest:request error:nil];
67     //打印查询数据
68     for (BabyModal *modal in resArray ) {
69         NSLog(@"查询结果:姓名=%@ ,年龄=%ld ,性别=%@",modal.name,modal.age,[NSString stringWithFormat:@"%d",modal.gender]);
70     }
71 }
72 //删除方法
73 - (IBAction)deleteAction:(UIButton *)sender {
74     //建立删除请求
75     NSFetchRequest *deleRequest = [NSFetchRequest fetchRequestWithEntityName:@"Baby"];
76     //删除条件
77     NSPredicate *pre = [NSPredicate predicateWithFormat:@"age < %d", 10];
78     deleRequest.predicate = pre;
79     //返回须要删除的对象数组
80     NSArray *deleArray = [_context executeFetchRequest:deleRequest error:nil];
81     //从数据库中删除
82     for (BabyModal *stu in deleArray) {
83         [_context deleteObject:stu];
84     }
85     NSError *error = nil;
86     //保存--记住保存
87     if ([_context save:&error]) {
88         NSLog(@"删除 age < 10 的数据");
89     }else{
90         NSLog(@"删除数据失败, %@", error);
91     }
92 }
93 
94 
95 
96 @end

2.手动建立(iOS8+ 推荐使用

2.1 建立工程

手动建立工程

 

 

 

 

 

 

 

 

 

 

 

 

2.2 建立DataModel

手动建立DataModel

 

 

 

 

 

 

 

 

 

 

 

 

手动建立DataModel结果

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.3 建立实体对象

建立实体对象

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.4 实体对象命名,Language属性值选择

实体对象命名Language属性

 

 

 

 

 

 

 

 

 

 

 

2.5 实体对象属性codegen选择

实体对象属性codegen选择

 

 

 

 

 

 

 

 

 

 

2.6 添加实体对象属性

添加实体对象属性

 

 

 

 

 

 

 

 

 

2.7 建立实体对象的子类文件

建立实体对象子类文件

 

 

 

 

 

 

 

 

 

 

 

选择datamodel

 

 

 

 

 

 

 

 

 

 

 

 

 

选择实体对象

 

 

 

 

 

 

 

 

 

 

 

 

 

建立实体的子类文件图

 

 

 

 

 

 

 

2.8 建立NSManagedObject模型 (模型命名不可和实体名称相同)

建立NSManagedObject模型

 

 

 

 

 

 

 

 

 

2.9 为模型添加属性

为模型添加属性

 

 

 

 

 

 

 

 

 

 

为模型添加属性2

 

 

 

 

 

 

 

 

 

2.10 ViewController.m (URLForResource参数须要根据建立的Datamodel的名称来)

  1 //
  2 //  ViewController.m
  3 //  Coredatanpp
  4 //
  5 //  Created by Z_小圣 on 2019/3/19.
  6 //  Copyright © 2019年 奶瓶瓶. All rights reserved.
  7 //
  8 
  9 #import "ViewController.h"
 10 #import "BabyModal.h"
 11 @interface ViewController ()
 12 {
 13     NSManagedObjectContext *_context;
 14 }
 15 @end
 16 
 17 @implementation ViewController
 18 
 19 - (void)viewDidLoad {
 20     [super viewDidLoad];
 21     [self createSqlite];//建立数据库
 22     // Do any additional setup after loading the view, typically from a nib.
 23 }
 24 //建立数据库
 25 - (void)createSqlite{
 26     
 27     //一、建立模型对象
 28     //获取模型路径 URLForResource参数须要根据建立的Datamodel的名称来
 29     NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CoredatanppManual" withExtension:@"momd"];
 30     //根据模型文件建立模型对象
 31     NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
 32     
 33     //二、建立持久化存储助理:数据库
 34     //利用模型对象建立助理对象
 35     NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
 36     
 37     //数据库的名称和路径
 38     NSString *docStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
 39     NSString *sqlPath = [docStr stringByAppendingPathComponent:@"coreData.sqlite"];
 40     NSLog(@"数据库 path = %@", sqlPath);
 41     NSURL *sqlUrl = [NSURL fileURLWithPath:sqlPath];
 42     
 43     NSError *error = nil;
 44     //设置数据库相关信息 添加一个持久化存储库并设置类型和路径,NSSQLiteStoreType:SQLite做为存储库
 45     [store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:sqlUrl options:nil error:&error];
 46     
 47     if (error) {
 48         NSLog(@"添加数据库失败:%@",error);
 49     } else {
 50         NSLog(@"添加数据库成功");
 51     }
 52     
 53     //三、建立上下文 保存信息 对数据库进行操做
 54     NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
 55     
 56     //关联持久化助理
 57     context.persistentStoreCoordinator = store;
 58     _context = context;
 59 }
 60 //添加方法
 61 - (IBAction)addAction:(UIButton *)sender {
 62     // 1.建立一个新的继承于NSManagedObject的子类BabyModal
 63     BabyModal *baby = [NSEntityDescription  insertNewObjectForEntityForName:@"Baby"  inManagedObjectContext:_context];
 64 
 65     //2.根据表Baby中的键值,给NSManagedObject对象赋值
 66     baby.name = [NSString stringWithFormat:@"长江-%d",arc4random()%100];
 67     baby.age = arc4random()%20;
 68     baby.gender = arc4random()%2 == 0 ?  0: 1;
 69     
 70 //       3.保存插入的数据
 71     NSError *error = nil;
 72     if ([_context save:&error]) {
 73         NSLog(@"数据插入到数据库成功");
 74     }else{
 75         NSLog(@"数据插入到数据库失败,%@",error);
 76     }
 77     
 78 }
 79 //查询方法
 80 - (IBAction)queryAction:(UIButton *)sender {
 81     
 82     //建立查询请求
 83     NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Baby"];
 84     //查询条件
 85     NSPredicate *pre = [NSPredicate predicateWithFormat:@"gender = %@", @"0"];
 86     request.predicate = pre;
 87     // 从第几页开始显示
 88     // 经过这个属性实现分页
 89     //request.fetchOffset = 0;
 90     // 每页显示多少条数据
 91     //request.fetchLimit = 6;
 92     //发送查询请求
 93     NSArray *resArray = [_context executeFetchRequest:request error:nil];
 94     //打印查询数据
 95     for (BabyModal *modal in resArray ) {
 96         NSLog(@"查询结果:姓名=%@ ,年龄=%ld ,性别=%@",modal.name,modal.age,[NSString stringWithFormat:@"%d",modal.gender]);
 97     }
 98 }
 99 //删除方法
100 - (IBAction)deleteAction:(UIButton *)sender {
101     //建立删除请求
102     NSFetchRequest *deleRequest = [NSFetchRequest fetchRequestWithEntityName:@"Baby"];
103     //删除条件
104     NSPredicate *pre = [NSPredicate predicateWithFormat:@"age < %d", 10];
105     deleRequest.predicate = pre;
106     //返回须要删除的对象数组
107     NSArray *deleArray = [_context executeFetchRequest:deleRequest error:nil];
108     //从数据库中删除
109     for (BabyModal *stu in deleArray) {
110         [_context deleteObject:stu];
111     }
112     NSError *error = nil;
113     //保存--记住保存
114     if ([_context save:&error]) {
115         NSLog(@"删除 age < 10 的数据");
116     }else{
117         NSLog(@"删除数据失败, %@", error);
118     }
119 }
120 
121 
122 
123 @end

3.实施中遇到问题

3.1错误信息:

:-1: Multiple commands produce '/Users/z_xiaosheng/Library/Developer/Xcode/DerivedData/TeacherCoredata-gmqlwsropogypygztobrkbxffcqs/Build/Intermediates.noindex/TeacherCoredata.build/Debug-iphonesimulator/TeacherCoredata.build/Objects-normal/x86_64/Coreteacheppp+CoreDataProperties.o':
1) Target 'TeacherCoredata' (project 'TeacherCoredata') has compile command with input '/Users/z_xiaosheng/Desktop/test/TeacherCoredata/Coreteacheppp+CoreDataProperties.m'
2) Target 'TeacherCoredata' (project 'TeacherCoredata') has compile command with input '/Users/z_xiaosheng/Library/Developer/Xcode/DerivedData/TeacherCoredata-gmqlwsropogypygztobrkbxffcqs/Build/Intermediates.noindex/TeacherCoredata.build/Debug-iphonesimulator/TeacherCoredata.build/DerivedSources/CoreDataGenerated/TeacherCoredata/Coreteacheppp+CoreDataProperties.m'

  错误缘由:实体属性Codegen(编译,生成)值为非Manual/None,建立出来的类编译后会报错。

  解决方案:选中实体将实体属性Codegen(编译,生成)值改成Manual/None,清空当前build,从新编译