学习在创建好的工程里面添加CoreData
在学习CoreData中, 在建工程后, 没有添加, 于是就参考网络文章进行更改.
这几天在学习做一个ios的小项目,项目中需要对数据进行基本的增删改查操作。于是就想用一把CoreData。但在创建项目初期,没有包含进CoreData。于是就在已建好的项目中加入CoreData。由于第一次用CoreData,各方面还不是很熟悉,在网上爬文,于是,自己在这篇文章的基础上经过一天的研究,特把自己出错的地方进行简单的总结。并把步骤完善一下。
1.如果想在已建好的项目中加入CoreData,首先需要引入CoreData FrameWork。这里需要先点击target,然后再点击Build Phases,在下面的界面中找到LinkBinary With Libraries。点击箭头,展开这一项,然后再点击加号,出现Framework项界面。在搜索框中输入CoreData,这时出现CoreData.framework,选中它并点击Add按钮而加入CoreData FrameWork。这时会在target的下面出现CoreData.framework。为了文件的分类方便,可以把CoreData.framework拖入Frameworks中。然后保存就好了。然后在prefix.pch中加入#import。

2.加入数据模型,点击iWeather文件夹,然后点击右键,再点击New File。在弹出的界面的左边点击IOS,选择下面的CoreData,然后再点击右边的Data Model,之后点击Next,进入下一页,在这里弹出的界面需要在Save As中的.xcdatamodeld之前写入你的数据模型的名字。这里的名字任意写。我这里写的与项目名一样为iWeather。点击Create,在Show the Project Navigation将创建出一个数据模型iWeather.xcdatamodeld。


3.做好以上的这些工作之后,不要先急着去创建Entity。而是去Delegate中建立CoreData与Delegate的关联。这时,点击LWTAppDelegate.h,在@interface与@end之中加入以下代码;
@property (readonly,strong,nonatomic)NSManagedObjectContext *managedObjectContext;
@property (readonly,strong,nonatomic)NSManagedObjectModel *managedObjectModel;
@property (readonly,strong,nonatomic)NSPersistentStoreCoordinator *persistentStoreCoordinator;
- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;
上面的代码有几个名字术语:NSManagedObjectContext,NSManagedObjectModel,NSPersistentStoreCoordinator。
(1).Managed Object Model(管理数据模型):你可以将这个东西看作是数据库的轮廓,或者结构。这里包含了各个实体的定义信息,一般来说,你会使用我们刚刚看过的视觉编辑器来操作这个物体,添加属性,建立属性之间的关系等等,当然你也可以使用代码。
(2). Persistent Store Coordinator(持久性数据协调器): 你可以将这个东西看作是数据库连接库,在这里,你将设置数据存储的名字和位置,以及数据存储的时机。
(3). Managed Object Context (管理数据内容):你可以将这一部分看作是数据的实际内容,这也是整个数据库中对我们而言最重要的部分(这还用说),基本上,插入数据,查询数据,删除数据的工作都在这里完成。
上面这段对术语的解释摘自:http://www.dasheyin.com/ios_jiao_cheng_core_data_shu_ju_chi_jiu_xing_cun_chu_ji_chu_jiao_cheng.html。
4.之后打开LWTAppDelegate.m文件,在@implementation下面写入如下代码:
@synthesize managedObjectContext =_managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
然后在@end之前加入以下代码:
//相当于保存数据的方法
- (void)saveContext
{
NSError *error = nil;
NSManagedObjectContext *managedObjectContext =self.managedObjectContext;
if (managedObjectContext !=nil) {
if ([managedObjectContexthasChanges] && ![managedObjectContextsave:&error]) {
NSLog(@"Unresolvederror %@, %@", error, [erroruserInfo]);
abort();
}
}
}
#pragma mark - Core Data stack
// Returns the managed object context for the application.
// If the context doesn't already exist, it is created and bound to thepersistent store coordinator for the application.
- (NSManagedObjectContext *)managedObjectContext
{
if (_managedObjectContext !=nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [selfpersistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContextalloc]init];
[_managedObjectContextsetPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}
// Returns the managed object model for the application.
// If the model doesn't already exist, it is created from the application'smodel.
- (NSManagedObjectModel *)managedObjectModel
{
if (_managedObjectModel !=nil) {
return _managedObjectModel;
}
//这里一定要注意,这里的iWeather就是你刚才建立的数据模型的名字,一定要一致。否则会报错。
NSURL *modelURL = [[NSBundlemainBundle]URLForResource:@"iWeather"withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModelalloc]initWithContentsOfURL:modelURL];
return _managedObjectModel;
}
// Returns the persistent store coordinator for the application.
// If the coordinator doesn't already exist, it is created and theapplication's store added to it.
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator !=nil) {
return _persistentStoreCoordinator;
}
//这里的iWeaher.sqlite,也应该与数据模型的名字保持一致。
NSURL *storeURL = [[selfapplicationDocumentsDirectory]URLByAppendingPathComponent:@"iWeather.sqlite"];
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinatoralloc]initWithManagedObjectModel:[selfmanagedObjectModel]];
if (![_persistentStoreCoordinatoraddPersistentStoreWithType:NSSQLiteStoreTypeconfiguration:nilURL:storeURLoptions:nilerror:&error]) {
NSLog(@"Unresolvederror %@, %@", error, [erroruserInfo]);
abort();
}
return _persistentStoreCoordinator;
}
#pragma mark - Application's Documents directory
// Returns the URL to the application's Documents directory.
- (NSURL*)applicationDocumentsDirectory
{
return[[[NSFileManagerdefaultManager]URLsForDirectory:NSDocumentDirectoryinDomains:NSUserDomainMask]lastObject];
}
到这里就做好了一切的准备工作了。然后去创建Entity吧。
5.打开iWeather.xcdatamodeld文件。通过Editor Style按钮调到视图模式下。如下图这样:

然后点击Add Entity按钮增加Entity。

这时咱们对Entity进行修改。点击Entity上,把那么修改为ArInfo。然后再点击AddAttribute按钮进行属性的添加。增加myid和myname这两个属性。属性类型都为String。


在做好这些之后,开始建立相应的.h和.m文件。右键点击iWeather文件夹,点击newFile,在弹出的窗口中选择NSManagedObject subclass,然后点击Next按钮将会出现选择实体窗口(这里不一定,也可能不出现,如果不出现,就要看生成的新文件是关联那个实体的,如果实体比较多,应该会出现,不出现就一个实体一个实体的建立),选择上之后再点击Next出现保存界面,保存既可以。在项目中将出现ArInfo.h和ArInfo.m这两个文件。

6.然后在LWTAViewController.h的@interface与@end中加入
@property (strong,nonatomic)NSManagedObjectContext *context;
在LWTAViewController.m中的@implementation之后加@synthesize context;
并在LWTAViewController.m添加
#import "ArInfo.h"
#import "LWTAppDelegate.h"
这两个头文件。然后在ViewDidLoad中加入如下代码:
LWTAppDelegate *delegate = (LWTAppDelegate *)[[UIApplication sharedApplication]delegate];//这里需要引进自己项目的委托,是让全局managedObjectContext起作用。
self.context = delegate.managedObjectContext;
ArInfo *arInfo = [NSEntityDescriptioninsertNewObjectForEntityForName:@"ArInfo"inManagedObjectContext:context];
arInfo.myid=@"123";
arInfo.myname=@"object-c";
NSError *error = nil;
if (![contextsave:&error]) {
NSLog(@"%@",[errorlocalizedDescription]);
}
NSFetchRequest *fetchRequest = [[NSFetchRequestalloc]init];
NSEntityDescription *entity = [NSEntityDescriptionentityForName:@"ArInfo"inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSArray *fetchObject = [contextexecuteFetchRequest:fetchRequesterror:&error];
for (NSManagedObject *infoin fetchObject) {
NSLog(@"id:%@",[infovalueForKey:@"myid"]);
NSLog(@"name:%@",[infovalueForKey:@"myname"]);
}
这时运行程序。在All OutPut将输出:
id:123
name:object-c
学习在创建好的工程里面添加CoreData的更多相关文章
- springboot 创建子父工程
1.创建子父工程 2.添加pom配置文件 2.1 父工程pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" ...
- xilinx Vivado的使用详细介绍(2):创建工程、添加文件、综合、实现、管脚约束、产生比特流文件、烧写程序、硬件验证
xilinx Vivado的使用详细介绍(2):创建工程.添加文件.综合.实现.管脚约束.产生比特流文件.烧写程序.硬件验证 Author:zhangxianhe 新建工程 打开Vivado软件,直接 ...
- iOS 10 (X8)上CoreData的使用(包含创建工程时未添加CoreData)
1.在创建工程时未添加CoreData,后期想要使用CoreData则要在工程Appdelegate.h文件中添加CoreData库和CoreData中的通道类(用来管理类实例和CoreData之间的 ...
- django学习笔记【001】django版本的确定&创建一个django工程
2.3 查看当前的django版本 python3. -m django --version 2.3.1 创建一个django工程 django-admin startproject mysite 在 ...
- Eclipse创建java web工程配置Tomacat和JDK 【转】
在学习AJAX过程中,还用Intellij就有点老旧了,这是后装个Eclipse时,发现这个配置也很头疼,现在就叫你如何创建一个web工程,同时叫你配置Eclipse. 一.创建一个web工程 1.打 ...
- UE4编程之C++创建一个FPS工程(一)创建模式&角色&处理输入
转自:http://blog.csdn.net/u011707076/article/details/44180951 从今天开始,我们一起来学习一下,如何使用C++将一个不带有任何初学者内容的空模板 ...
- 使用IntelliJ IDEA创建Maven聚合工程、创建resources文件夹、ssm框架整合、项目运行一体化
一.创建一个空的项目作为存放整个项目的路径 1.选择 File——>new——>Project ——>Empty Project 2.WorkspaceforTest为项目存放文件夹 ...
- Keil uVision4 创建51单片机工程
Keil uVision4 创建51单片机工程 版权声明:未经授权,严禁转载! 在学习51单片机的过程当中,我们需要使用 Keil uVision4 来创建一个项目,今天就来图示一下创建的流程. 首先 ...
- 【转载】使用IntelliJ IDEA创建Maven聚合工程、创建resources文件夹、ssm框架整合、项目运行一体化
一.创建一个空的项目作为存放整个项目的路径 1.选择 File——>new——>Project ——>Empty Project 2.WorkspaceforTest为项目存放文件夹 ...
随机推荐
- IBM X3650 服务器更换内存的过程记录
前几天,由于天气气温太高,导致中心机房UPS自动保护性关闭,最终导致所有服务器都掉电.其中一台IBM X3650服务器报警,显示内存故障.原来这台服务器共有4G内存,现在打开服务器进入系统后,显示只有 ...
- Number对象
<script type="text/javascript"> /* Number对象. 创建Number对象的方式: 方式1: var 变量= new Number( ...
- UCOS 杂项 笔记
1. 建立任务和建立数据队列 哪个先建立? 经过试验得知,数据队列和任务的建立先后没有顺序,都可以正常运行. 2.关于主函数的面试问题. 主函数写法有: int main() 和voi ...
- MVC 使用AJAX POST上传图片的方式
我们来总结一下使用AJAX以POST方式上传图片的方法. 一.普遍的一种是以file的格式请求.在Request.Files中获取文件. public ActionResult UploadFile( ...
- VS2010安装项目的系统必备中添加.NET 2.0
把DotNetFX.rar解压后的DotNetFX文件夹,放置于安装了 VS2010 的 C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bootstrap ...
- Sicily 1931. 卡片游戏
题目地址:1931. 卡片游戏 思路: 纯属数据结构中队列的应用,可以练练手. 具体代码如下: #include <iostream> #include <queue> usi ...
- 一本QT书,连接MySQL图文并茂
http://qtdebug.com/index.html http://qtdebug.com/DB-AccessMySQL.html
- libCurl的C++引用
I believe I have gotten LibCurl to work with Visual Studio 2013 now. Persistence ftw! Although, afte ...
- PL/SQL 包头和包体
包用于逻辑组合相关的过程和函数,它由包规范和包体两部分组成,包规范用于定义公用的常量 变量,过程和函数,在SQL*PLUS中建立包规范可以使用CREATE PACKAGE命令. 实例如下: CREAT ...
- Linux系统编程(30)—— socket编程之TCP/IP协议
在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样.计算机使用者意识到,计算机 ...