iOS基础教程:在建好的项目中加入CoreData[转]
这几天在做一个ios的小项目,项目中需要对数据进行基本的增删改查操作。于是就想用一把CoreData。但在创建项目初期,没有包含进CoreData。于是就在已建好的项目中加入CoreData。由于第一次用CoreData,各方面还不是很熟悉,在网上爬文,找到了一篇关于这方面的文章(http://www.iteye.com/topic/1017633)。于是,自己在这篇文章的基础上经过一天的研究,特把自己出错的地方进行简单的总结。并把步骤完善一下。
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<CoreData/CoreData.h>。

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 (管理数据内容):你可以将这一部分看作是数据的实际内容,这也是整个数据库中对我们而言最重要的部分(这还用说),基本上,插入数据,查询数据,删除数据的工作都在这里完成。
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将输出:
2012-11-21 14:12:25.027 iWeather[2750:11603] id:123
2012-11-21 14:12:25.028 iWeather[2750:11603] name:object-c
from:http://www.lanou3g.com/blog/post-166.html
iOS基础教程:在建好的项目中加入CoreData[转]的更多相关文章
- Spring Data JPA系列2:SpringBoot集成JPA详细教程,快速在项目中熟练使用JPA
大家好,又见面了. 这是Spring Data JPA系列的第2篇,在上一篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring Data JPA,傻傻分不清楚?给你个 ...
- XamarinSQLite教程在Xamarin.Android项目中提取数据库文件
XamarinSQLite教程在Xamarin.Android项目中提取数据库文件 由于不能直接打开该文件,开发者需要先将数据库文件从Android系统中提取出来.操作步骤如下. (5)选择MyDoc ...
- XamarinSQLite教程在Xamarin.Android项目中定位数据库文件
XamarinSQLite教程在Xamarin.Android项目中定位数据库文件 实际开发中,经常需要验证数据库操作的正确性.这个时候,需要打开数据库文件,进行确认.下面是如何找到MyDocumen ...
- XamarinSQLite教程在Xamarin.Android项目中使用数据库
XamarinSQLite教程在Xamarin.Android项目中使用数据库 在Xamarin.Android项目中使用预设数据库的具体操作步骤如下: (1)创建一个Xamarin.Android项 ...
- (Python基础教程之十三)Python中使用httplib2 – HTTP GET和POST示例
Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...
- MyEclipse使用教程:在Web项目中使用Web片段
MyEclipse 在线订购年终抄底促销!火爆开抢>> MyEclipse最新版下载 本教程向用户展示了使用关联的Web项目创建Web片段项目的机制.用户还可以获得要检查的示例项目.在本教 ...
- Spring Boot 2.x基础教程:找回启动日志中的请求路径列表
如果您看过之前的Spring Boot 1.x教程,或者自己原本就对Spring Boot有一些经验,或者对Spring MVC很熟悉.那么对于Spring构建的Web应用在启动的时候,都会输出当前应 ...
- (Redis基础教程之六)如何使用Redis中的List
如何在ubuntu18.04上安装和保护redis 如何连接到Redis数据库 如何管理Redis数据库和Keys 如何在Redis中管理副本和客户端 如何在Redis中管理字符串 如何在Redis中 ...
- JQuery基础教程:选择元素(中)
自定义选择符 JQuery在各种CSS选择符的基础上还添加了独有的完全不同的自定义选择符,注意,只要可能,jQuery就会使用浏览器原生的DOM选择符引擎去查找元素.但在使用自定义选择符的时候,就无法 ...
随机推荐
- maven release plugin插件
1.打包版本区别 SNAPSHOT 快照版本(开发阶段,不稳定,容易出现bug)RELEASE 正式版本(外部依赖使用阶段,稳定,很少出现bug)Tag :标记每次代码提交的版本(比较稳定,类似分支) ...
- IDA Pro 权威指南学习笔记(十三) - 基本代码转换
IDA提供的代码转换包括: 1.将数据转换为代码 2.将代码转换为数据 3.指定一个指令序列为函数 4.更改现有函数的起始或结束地址 5.更改指令操作数的显示格式 代码显示选项 通过 Options ...
- linux命令日志处理
刘超 2018/10/8 10:32:43 zcat bi_www_activity_2018100*.log.gz |grep --color '多方电话h5_' | awk -F'|' '{pri ...
- Java--神奇的hashcode
一.Object的HashCode定义 public native int hashCode(); Object类的hashCode方式使用了native修饰也就意味着真正的实现调用的其他语言编写的方 ...
- vue之slot,组件标签嵌套
vue之slot,组件标签嵌套 插槽(Slot),在各种vue的ui插件中,经常见到的多个组件标签相互嵌套(如下)就是以此为基础的. <el-col > <el-checkbox & ...
- 「小程序JAVA实战」springboot的后台搭建(30)
转自:https://idig8.com/2018/08/27/xiaochengxujavashizhanspringbootdehoutaidajian30/ 做了多年的开发,原来很多项目都是一个 ...
- IDEA debug
版权声明: 本文转自:https://blog.csdn.net/qq_27093465/article/details/64124330 1,rerun XXX,这个就是直接重新跑某个程序.2,这个 ...
- LeetCode之动态规划
62. Unique Paths QuestionEditorial Solution Total Accepted: 86710 Total Submissions: 239084 Difficul ...
- 2018/4/26 python文件处理方式
目录 2018/4/26总结 1. 如果有一天群内问题总结: 问题:python2和python3的默认编码是什么? 2. python学习总结: python的处理文件方式 2018/4/26总结 ...
- Lamber算法 & SurfaceShader自定义光照
[SurfaceShader自定义光照] 1.在pragma中添加自定义光照函数名: #pragma surface surf BasicDiffuse 2.实现自定义光照函数.下面就是Lamber ...