iOS学习笔记-CoreData
简介
CoreData提供了对象关系映射(ORM)功能,从效果上说就是创建了一个"虚拟对象数据库",也可以把它看作一个综合的数据库管理库。
NSManagedObjectContext
被管理的数据上下文对象,主要负责应用和数据库之间的交互。我们就是用它来进行增删改查操作。它会记录用户对数据的所有改变。它有NSPersistentStoreCoordinator
属性。创建它需要设置NSPersistentStoreCoordinator。
NSPersistentStoreCoordinator
持久化数据协调库,用于添加持久化存储库,相当于数据库的连接器。也就是我们用数据库做持久化还是用XML做持久化是由它决定的。我们用它来设置存储库的类型和指定存储库的路径。它有NSManagedObjectModel属性。
NSManagedObjectModel
NSManagedObjectModel代表CoreData的模型文件。CoreData项目中有一个.xcdatamodeld文件,它就是CoreData的模型文件。我们在.xcdatamodeld文件里进行创建实体和添加实体的属性。所以所有的实体信息都在NSManagedObjectModel中。
NSManagedObject
NSManagedObject对应实体,NSManagedObject是实体的映射,被CoreData管理的数据记录。也就是说在CoreData中我们直接操作的数据对象是NSManagedObject,你可以把它们当做一个东西,但是在代码中我们使用NSManagedObject。
NSEntityDescripition
实体描述类。包含实体的名字和属性。可以通过它来操作指定的实体。
基于SQLite简单使用
1.创建工程
若是新建的工程,勾选Use Core Data选项
AppDelegate文件中自动生成被管理数据上下文等相关代码,不用我们自己来进行相关的配置,可以直接使用。
在AppDelegate.h文件中添加如下代码:
/**
* 上下文对象,负责应用和数据库之间的交互。我们就是用它来操作实体,进行增删改查等操作
*/
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
/**
* 管理数据模型,代表CoreData的模型文件。包含了所有实体的信息。
*/
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
/**
* 持久性数据协调器,添加持久化存储裤。在这里设置使用数据库还是xml等存储裤来做持久化,以及存储裤的路径
*/
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
//保存数据到持久层(数据库)
- (void)saveContext;
//应用程序沙盒Document目录
- (NSURL *)applicationDocumentsDirectory;
在AppDelegate.m文件中:
保存数据到持久层
- (void)applicationWillTerminate:(UIApplication *)application {
[self saveContext];
} - (void)saveContext {
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil) {
NSError *error = nil;
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
}
被管理的数据模型
- (NSManagedObjectModel *)managedObjectModel {
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
//指定.xcdatamodeld文件,该文件编译后会变为momd文件
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CoreDataDemo" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
}
持久性数据协调器
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; //数据库路径
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreDataDemo.sqlite"];
NSError *error = nil;
NSString *failureReason = @"There was an error creating or loading the application's saved data."; /*
addPersistentStoreWithType:指定存储类型
NSSQLiteStoreType: 数据库
NSXMLStoreType: XML
NSBinaryStoreType: 二进制文件
NSInMemoryStoreType: 内存形式
*/
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
// Report any error we got.
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data";
dict[NSLocalizedFailureReasonErrorKey] = failureReason;
dict[NSUnderlyingErrorKey] = error;
error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code: userInfo:dict]; NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
} return _persistentStoreCoordinator;
}
被管理数据上下文
- (NSManagedObjectContext *)managedObjectContext { if (_managedObjectContext != nil) {
return _managedObjectContext;
} NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (!coordinator) {
return nil;
}
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
return _managedObjectContext;
}
如果不是新工程建模后加入这些代码即可
2.添加实体
在工程中选中.xcdatamdeld文件
点击
在右侧栏对实体命名
或者双击默认实体名进行命名
点击Add Attribute添加实体属性
如果一个实体中包含另一个实体,例如有一个实体Person还有一个实体Card。Person中有一个属性card,Card中也有一个属性person。那么就需要建立两个实体间的关系。如果下图这个页面,点击上图的Editor Style按钮切换一下。
两个实体都按这种方法创建关系。
选中关系,在右侧Delete Rule可以设置删除规则
关联模式Cascade,一个数据被删除,另一个实体的数据也会删除。
按Editor Style按钮切换到另一种视图模式,最终两个实体关系图为:
3.为每个实体生成NSManagedObject子类
具体的类名就是实体的class,默认情况下就是实体的名字。如果不想用实体名字做类名只需更改实体的class:
4.插入数据
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
//获取上下文
NSManagedObjectContext *contxt = [appDelegate managedObjectContext]; //创建Person对象。创建被管理的NSManagedObject对象,指定实体名字
Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:contxt];
//设置person属性
[person setValue:@"小小" forKey:@"name"];
[person setValue:[NSNumber numberWithInt:] forKey:@"age"]; //创建Card对象。
Card *card = [NSEntityDescription insertNewObjectForEntityForName:@"Card" inManagedObjectContext:contxt];
//设置card属性
[card setValue:[NSNumber numberWithInt:] forKey:@"num"]; //设置对象间关系
[person setValue:card forKey:@"card"];
[card setValue:person forKey:@"person"]; NSError *error = nil;
/*
hasChanges:判断数据是否有变化
save:保存数据变化,并将其同步到持久化数据文件中
*/
if ([contxt hasChanges] && ![contxt save:&error]) {
NSLog(@"插入失败:%@,%@",error,error.userInfo);
}
else {
NSLog(@"插入成功");
}
5.查询数据
AppDelegate *appDelegate = [[AppDelegate alloc] init];
NSManagedObjectContext *cxt = [appDelegate managedObjectContext]; //实体关联的描述类,指定实体名字获取
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:cxt]; //数据提取请求类
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
//实体描述设定到请求对象中
fetchRequest.entity = entity;
//查询条件,如果想查询全部补设置查询条件即可
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"name=%@",@"小明"];
//排序,指定排序字段和排序方式。根据年龄正序排序
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
//把排序描述设定到请求对象中
NSArray *sortDescriptors = @[sortDescriptor];
fetchRequest.sortDescriptors = sortDescriptors;
//限制一次提取数据的纪录数
fetchRequest.fetchLimit = ; NSError *error = nil;
//请求查询,返回数组中存放被管理的ModelManagedObject实体对象
NSArray *listData = [cxt executeFetchRequest:fetchRequest error:&error];
for (Person *person in dataList) {
NSLog(@"\nname:%@\tage:%@\ncard:%@",person.name,person.age,person.card.num);
}
6.删除数据
AppDelegate *appDelegate = [[AppDelegate alloc] init];
NSManagedObjectContext *cxt = appDelegate.managedObjectContext; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Model" inManagedObjectContext:cxt]; NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = entity;
request.predicate = [NSPredicate predicateWithFormat:@"title=%@",model.title]; NSError *error = nil;
NSArray *listData = [cxt executeFetchRequest:request error:&error]; if (listData.count > ) {
ModelManagedObject *modelObject = [listData lastObject];
[cxt deleteObject:modelObject]; error = nil;
if ([cxt hasChanges] && ![cxt save:&error]) {
NSLog(@"删除数据失败:%@",[error userInfo]);
}
else {
NSLog(@"删除数据成功");
}
}
7.修改数据
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *contxt = [appDelegate managedObjectContext]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:contxt]; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
fetchRequest.entity = entity; fetchRequest.predicate = [NSPredicate predicateWithFormat:@"name=%@",@"小明"];
NSArray *dataList = [contxt executeFetchRequest:fetchRequest error:nil]; Person *p = dataList.lastObject;
p.name = @"小红"; if ([contxt hasChanges] && ![contxt save:nil]) {
NSLog(@"修改失败");
}
else {
NSLog(@"修改成功");
}
iOS学习笔记-CoreData的更多相关文章
- iOS学习笔记17-FMDB
上一节我已经介绍了SQLite的简单使用,不了解的可以提前去看一下iOS学习笔记16-数据库SQLite,这节我们来讲下FMDB. 一.FMDB介绍 FMDB是一种第三方的开源库,FMDB就是对SQL ...
- iOS学习笔记17-FMDB你好!
上一节我已经介绍了SQLite的简单使用,不了解的可以提前去看一下iOS学习笔记16-数据库SQLite,这节我们来讲下FMDB. 一.FMDB介绍 FMDB是一种第三方的开源库,FMDB就是对SQL ...
- iOS学习笔记——AutoLayout的约束
iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...
- IOS学习笔记25—HTTP操作之ASIHTTPRequest
IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...
- IOS学习笔记之关键词@dynamic
IOS学习笔记之关键词@dynamic @dynamic这个关键词,通常是用不到的. 它与@synthesize的区别在于: 使用@synthesize编译器会确实的产生getter和setter方法 ...
- iOS学习笔记-精华整理
iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...
- iOS学习笔记10-UIView动画
上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UI ...
- iOS学习笔记总结整理
来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...
- iOS学习笔记之Category
iOS学习笔记之Category 写在前面 Category是类别(也称为类目或范畴),使用Category,程序员可以为任何已有的类添加方法.使用类别可以对框架提供的类(无法获取源码,不能直接修改) ...
- iOS学习笔记之ARC内存管理
iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其 ...
随机推荐
- JDK + Tomcat 安装配置
学习Java 开发的第一步就是配置环境,今天第一次配置,把过程记录下以备后用. 一.下载JDK.Tomcat JDK:http://www.oracle.com/technetwork/java/ja ...
- web标准(复习)--1
XHTML CSS基础知识 一.xhtml css基础知识首先说一下我们这节课的知识点 1.文档类型 2.语言编码 3.html标签 4.css样式 5.css优先级 6.css盒模型组成 1)文档类 ...
- AFC项目开发文档整理
AFC项目开发文档整理 PHPCMS 的确是一个伟大的CMS,我对它爱不释手. 标签嵌套无法loop获取的解决办法.关键代码如下: /\*后台添加\*/ $str = preg_replace ( & ...
- C程序设计语言练习题1-8
练习1-8 编写一个统计空格.制表符与换行符个数的程序. 代码如下: #include <stdio.h> // 包含标准库的信息. int main() // 定义名为main的函数,它 ...
- C程序设计语言练习题1-2
练习1-2 做个实验,当printf函数的参数字符串中包含\c(其中c是上面的转义字符串序列中未曾列出的某一个字符)时,观察一下会出现什么情况. 代码如下: #include <stdio.h& ...
- linux_grep
grep常用的命令行选项: 选项 说明 -c 只显示有多少行匹配,而不具体显示匹配的行. -h 不显示文件名. -i 在字符串比较的时候忽略大小写. -l 只显示包含匹配模板的行的文件名清单. -L ...
- iphone 拨打电话的 两种方法-备
大家想不想在自己的应用中拨打电话呀?打电话可以用openURL:这个API, 如:[[UIApplication sharedApplication] openURL:[NSURL URLWithSt ...
- 关于MPLS协议几个容易忽略的点
1.随着硬件技术的进步,产生了高速路由器和三层交换机,MPLS提高转发的速度的初衷已经没有多少意义.但是MPLS由于其支持标签栈和面向连接的特点,使其在虚拟专用网,流量工程,QoS等方面得到广泛的应用 ...
- 使用iText生成带底图的PDF
package com.wzh.itext; import com.itextpdf.text.Chunk; import com.itextpdf.text.Document; import com ...
- 在O(1) 时间删除链表节点
struct Node { int val; Node * next; }; void deleteNode(Node ** head, Node * target) { assert(head != ...