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

** 使用Coredata需要要导入<CoreData/CoreData.h> **

1、系统创建(系统创建生成NSPersistentContainer, iOS10+,iPhoneX;iOS8+ 使用手动创建Coredata)

1.1创建工程

1.2 创建实体对象

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

1.4 实体对象属性codegen选择

1.5 添加实体对象属性

1.6 创建实体对象的子类文件

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

1.8为模型添加属性

1.9 Viewcontroller.m (由于系统创建datamodel,系统已将coredata数据库初始化,无需自己初始化数据库)

 //
// ViewController.m
// Coredatanpp
//
// Created by Z_小圣 on 2019/3/19.
// Copyright © 2019年 奶瓶瓶. All rights reserved.
// #import "ViewController.h"
#import "BabyModal.h"
#import "AppDelegate.h"
@interface ViewController ()
{
NSManagedObjectContext *_context;
NSPersistentContainer *_container;
NSManagedObjectModel *_managedObjectModel;
}
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
AppDelegate * appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
_container = appDelegate.persistentContainer;
//返回沙盒中存储数据库的文件夹URL路径,这是一个静态方法,表示数据库的文件路径是唯一的
NSURL * url = [NSPersistentContainer defaultDirectoryURL];
NSLog(@"沙盒路径%@",url);
_context = _container.viewContext;
_managedObjectModel = _container.managedObjectModel;
// Do any additional setup after loading the view, typically from a nib.
}
//添加方法
- (IBAction)addAction:(UIButton *)sender {
// 1.创建一个新的继承于NSManagedObject的子类BabyModal
BabyModal *baby = [NSEntityDescription insertNewObjectForEntityForName:@"Baby" inManagedObjectContext:_context]; //2.根据表Baby中的键值,给NSManagedObject对象赋值
baby.name = [NSString stringWithFormat:@"长江-%d",arc4random()%];
baby.age = arc4random()%;
baby.gender = arc4random()% == ? : ; // 3.保存插入的数据
NSError *error = nil;
if ([_context save:&error]) {
NSLog(@"数据插入到数据库成功");
}else{
NSLog(@"数据插入到数据库失败,%@",error);
} }
//查询方法
- (IBAction)queryAction:(UIButton *)sender { //创建查询请求
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Baby"];
//查询条件
NSPredicate *pre = [NSPredicate predicateWithFormat:@"gender = %@", @""];
request.predicate = pre;
// 从第几页开始显示
// 通过这个属性实现分页
//request.fetchOffset = 0;
// 每页显示多少条数据
//request.fetchLimit = 6;
//发送查询请求
NSArray *resArray = [_context executeFetchRequest:request error:nil];
//打印查询数据
for (BabyModal *modal in resArray ) {
NSLog(@"查询结果:姓名=%@ ,年龄=%ld ,性别=%@",modal.name,modal.age,[NSString stringWithFormat:@"%d",modal.gender]);
}
}
//删除方法
- (IBAction)deleteAction:(UIButton *)sender {
//创建删除请求
NSFetchRequest *deleRequest = [NSFetchRequest fetchRequestWithEntityName:@"Baby"];
//删除条件
NSPredicate *pre = [NSPredicate predicateWithFormat:@"age < %d", ];
deleRequest.predicate = pre;
//返回需要删除的对象数组
NSArray *deleArray = [_context executeFetchRequest:deleRequest error:nil];
//从数据库中删除
for (BabyModal *stu in deleArray) {
[_context deleteObject:stu];
}
NSError *error = nil;
//保存--记住保存
if ([_context save:&error]) {
NSLog(@"删除 age < 10 的数据");
}else{
NSLog(@"删除数据失败, %@", error);
}
} @end

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

2.1 创建工程

2.2 创建DataModel

2.3 创建实体对象

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

2.5 实体对象属性codegen选择

2.6 添加实体对象属性

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

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

2.9 为模型添加属性

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

 //
// ViewController.m
// Coredatanpp
//
// Created by Z_小圣 on 2019/3/19.
// Copyright © 2019年 奶瓶瓶. All rights reserved.
// #import "ViewController.h"
#import "BabyModal.h"
@interface ViewController ()
{
NSManagedObjectContext *_context;
}
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
[self createSqlite];//创建数据库
// Do any additional setup after loading the view, typically from a nib.
}
//创建数据库
- (void)createSqlite{ //1、创建模型对象
//获取模型路径 URLForResource参数需要根据创建的Datamodel的名称来
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CoredatanppManual" withExtension:@"momd"];
//根据模型文件创建模型对象
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; //2、创建持久化存储助理:数据库
//利用模型对象创建助理对象
NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model]; //数据库的名称和路径
NSString *docStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *sqlPath = [docStr stringByAppendingPathComponent:@"coreData.sqlite"];
NSLog(@"数据库 path = %@", sqlPath);
NSURL *sqlUrl = [NSURL fileURLWithPath:sqlPath]; NSError *error = nil;
//设置数据库相关信息 添加一个持久化存储库并设置类型和路径,NSSQLiteStoreType:SQLite作为存储库
[store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:sqlUrl options:nil error:&error]; if (error) {
NSLog(@"添加数据库失败:%@",error);
} else {
NSLog(@"添加数据库成功");
} //3、创建上下文 保存信息 对数据库进行操作
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; //关联持久化助理
context.persistentStoreCoordinator = store;
_context = context;
}
//添加方法
- (IBAction)addAction:(UIButton *)sender {
// 1.创建一个新的继承于NSManagedObject的子类BabyModal
BabyModal *baby = [NSEntityDescription insertNewObjectForEntityForName:@"Baby" inManagedObjectContext:_context]; //2.根据表Baby中的键值,给NSManagedObject对象赋值
baby.name = [NSString stringWithFormat:@"长江-%d",arc4random()%];
baby.age = arc4random()%;
baby.gender = arc4random()% == ? : ; // 3.保存插入的数据
NSError *error = nil;
if ([_context save:&error]) {
NSLog(@"数据插入到数据库成功");
}else{
NSLog(@"数据插入到数据库失败,%@",error);
} }
//查询方法
- (IBAction)queryAction:(UIButton *)sender { //创建查询请求
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Baby"];
//查询条件
NSPredicate *pre = [NSPredicate predicateWithFormat:@"gender = %@", @""];
request.predicate = pre;
// 从第几页开始显示
// 通过这个属性实现分页
//request.fetchOffset = 0;
// 每页显示多少条数据
//request.fetchLimit = 6;
//发送查询请求
NSArray *resArray = [_context executeFetchRequest:request error:nil];
//打印查询数据
for (BabyModal *modal in resArray ) {
NSLog(@"查询结果:姓名=%@ ,年龄=%ld ,性别=%@",modal.name,modal.age,[NSString stringWithFormat:@"%d",modal.gender]);
}
}
//删除方法
- (IBAction)deleteAction:(UIButton *)sender {
//创建删除请求
NSFetchRequest *deleRequest = [NSFetchRequest fetchRequestWithEntityName:@"Baby"];
//删除条件
NSPredicate *pre = [NSPredicate predicateWithFormat:@"age < %d", ];
deleRequest.predicate = pre;
//返回需要删除的对象数组
NSArray *deleArray = [_context executeFetchRequest:deleRequest error:nil];
//从数据库中删除
for (BabyModal *stu in deleArray) {
[_context deleteObject:stu];
}
NSError *error = nil;
//保存--记住保存
if ([_context save:&error]) {
NSLog(@"删除 age < 10 的数据");
}else{
NSLog(@"删除数据失败, %@", error);
}
} @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,重新编译

Coredata 单表简单使用的更多相关文章

  1. python开发mysql:表关系&单表简单查询

    一 一对多,多对一 1.1 建立多对一 ,一对多的关系需要注意 先建立被关联的表,被关联的字段必须保证时唯一的 在创建关联的表,关联的字段一定是可以重复的 1.2 示例: 出版社 多对一,多个老师可能 ...

  2. Maven+SSM框架,实现单表简单的增删改查

    目录 1.创建web Maven项目 2.创建java源码文件和resources资源文件 3.创建数据库配置文件:jdbc.properties 4.项目总体目录: 5.添加spring配置文件:a ...

  3. CoreData 多表 关联

    本文转载至 http://www.jianshu.com/p/e9f3b5e0cd19 1.概念简介 coreData中存在复杂的数据关系时,一张表难以满足需求,此时就需要了解使用coreData多表 ...

  4. Django单表操作

    一.数据库相关设置 配置ORM的loggers日志: # 配置ORM的loggers日志 LOGGING = { 'version': 1, 'disable_existing_loggers': F ...

  5. MySQL入门,第七部分,单表查询

    首先我们需要了解一下整个数据库的结构 其中Student表中Sno为主键.Study表中Sno和Cno合起来做主键.Course表中Cno为主键 其创建脚本如下: #----------------- ...

  6. Django框架05 /orm单表操作

    Django框架05 /orm单表操作 目录 Django框架05 /orm单表操作 1. orm使用流程 2. orm字段 3. orm参数 4. orm单表简单增/删/改 5. orm单表查询 5 ...

  7. Oracle单表的简单查询

    Oracle单表的简单查询 查看表结构 desc emp; 查询所有列 Select * from emp; 查找所以部门编号(查指定的列) select deptnofrom emp; 查找编号不同 ...

  8. php框架中的phalcon框架的安装,及初步认识,从表单提交简单的数据到数据库中

    php框架中的phalcon框架的安装,及初步认识,从表单提交简单的数据到数据库中 1.phalcon框架的安装: phalcon框架在windows本地安装可以利用wamp软件,安装之后可以查看对应 ...

  9. python全栈开发day61-django简单的出版社网站展示,添加,删除,编辑(单表的增删改查)

    day61 django内容回顾: 1. 下载: pip install django==1.11.14 pip install -i 源 django==1.11.14 pycharm 2. 创建项 ...

随机推荐

  1. jenkins配置sonarqube

    jenkins配置sonarqube 下载插件SonarQube Scanner for Jenkins 在系统管理系统设置中选择 SonarQube servers 配置服务器名称.访问URL地址, ...

  2. python - class类 (六) 三大特性 - 多态

    多态的概念: # 多态的概念 # 指出了对象如何通过他们共同的属性和动作来操作及访问而不需考虑他们的具体的类 # 多态表明了动态绑定的存在,允许重载及运行时类型确定和验证. # 示例模拟: #水具有多 ...

  3. ppt 制作圆角三角形

    制作圆角三角形: PART 01 :插入三角形与三个等大的圆形: PART 02 :利用[任意多边形]和[合并形状-剪除]获得缺三角: (先选中大三角形,然后再选中任意多边形,"格式&quo ...

  4. numpy 中 shape_base提供的tile方法

    tile函数 来自于numpy.lib.shape_base 功能:重复某个数组. 比如说tile(A, n), 功能是将数组A重复n次,构成一个新的数组(行数只有1个) 比如说tile(A, n, ...

  5. 【转】Linux中常见问题(磁盘 定时任务)

    [转]Linux中常见问题(磁盘 定时任务) 第1章 linux无法上网 1)     第一步,先ping域名. ping www.baidu.com 2)再ping一个公网ip , ping 223 ...

  6. 一文看懂汽车电子ECU bootloader工作原理及开发要点

    随着半导体技术的不断进步(按照摩尔定律),MCU内部集成的逻辑功能外设越来越多,存储器也越来越大.消费者对于汽车节能(经济和法规对排放的要求)型.舒适性.互联性.安全性(功能安全和信息安全)的要求越来 ...

  7. MySQL占用IO过高解决方案【转】

    1.日志产生的性能影响: 由于日志的记录带来的直接性能损耗就是数据库系统中最为昂贵的IO资源.MySQL的日志包括错误日志(ErrorLog),更新日志(UpdateLog),二进制日志(Binlog ...

  8. Vistual Studio Community 2017 账号的许可证过期,公安网激活方法

    方法:   1.外网电脑打开Vistual Studio Community2017   2.在许可证过期弹窗中登陆账号即可自动下载许可证完成激活      许可证下载路径(C:\用户\user\Ap ...

  9. Qt Ubuntu 编译出错-1: error: 找不到 -lGL

    安装好,编译界面程序出错“-1: error: 找不到 -lGL” 在终端运行如下命令(安装Qt5.8.0) sudo apt-get install libqt5-dev sudo apt-get ...

  10. sipML5聊天功能实现

    一.环境说明:在阅读sipML5的API文档时,发现它具有聊天的功能,于是在sipML5的源码中进行设定,实现了注册之后可以英文聊天(中文聊天需要在FreeSWITCh中进行设定). 二.具体配置: ...