iOS: Core Data入门
Core Data是ORM框架,很像.NET框架中的EntityFramework。使用的基本步骤是:
- 在项目属性里引入CoreData.framework (标准库)
- 在项目中新建DataModel (生成*.xcdatamodeld文件)
- 在DataModel里创建Entity
- 为Entity生成头文件(菜单Editor/Create NSMangedObject Subclass...)
- 在项目唯一的委托类(AppDelegate.h, AppDelegate.m)里添加managedObjectContext 用来操作Core Data
- 代码任意位置引用 managedObjectContext 读写数据
模型:(注意:myChapter, myContent这些关系都是Cascade,这样删父对象时才会删除子对象)

生成的头文件:
/* Book.h */
@interface Book : NSManagedObject @property (nonatomic, retain) NSNumber * bookId;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSString * author;
@property (nonatomic, retain) NSString * summary;
@property (nonatomic, retain) NSSet *myChapters;
@end @interface Book (CoreDataGeneratedAccessors) - (void)addMyChaptersObject:(NSManagedObject *)value;
- (void)removeMyChaptersObject:(NSManagedObject *)value;
- (void)addMyChapters:(NSSet *)values;
- (void)removeMyChapters:(NSSet *)values; @end /* Chapter.h */
@class Book;
@interface Chapter : NSManagedObject @property (nonatomic, retain) NSNumber * chapId;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * orderId;
@property (nonatomic, retain) Book *ownerBook;
@property (nonatomic, retain) NSManagedObject *myContent; @end /* TextContent.h */
@class Chapter; @interface TextContent : NSManagedObject @property (nonatomic, retain) NSNumber * chapId;
@property (nonatomic, retain) NSString * text;
@property (nonatomic, retain) Chapter *ownerChapter; @end
委托类代码
AppDelegate.h
// AppDelegate.h #import <UIKit/UIKit.h>
#import <CoreData/CoreData.h> #import "Book.h"
#import "Chapter.h"
#import "TextContent.h" @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; @end
AppDelegate.m
@implementation AppDelegate
@synthesize managedObjectContext = _managedObjectContext; -(NSManagedObjectContext *)managedObjectContext
{
if (_managedObjectContext != nil) {
return _managedObjectContext;
} _managedObjectContext = [[NSManagedObjectContext alloc]init]; // 设置数据库路径
NSURL *url = [[[NSFileManager defaultManager]
URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]lastObject];
NSURL *storeDataBaseURL = [url URLByAppendingPathComponent:@"BOOKS.sqlite"]; // 创建presistentStoreCoordinator
NSError *error = nil;
NSPersistentStoreCoordinator *presistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[NSManagedObjectModel mergedModelFromBundles: nil]]; // 指定存储类型和路径
if (![presistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil URL:storeDataBaseURL options:nil error:&error]) {
NSLog(@"error : %@", error);
} [_managedObjectContext setPersistentStoreCoordinator: presistentStoreCoordinator];
return _managedObjectContext;
}
使用_managedObjectContext操作Core Data
// 保存新对象
-(void) testStore
{
// 从AppDelegate 获得context
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = [appDelegate managedObjectContext]; // 第一个章节
TextContent *content1 = [NSEntityDescription insertNewObjectForEntityForName:@"TextContent" inManagedObjectContext:context];
content1.chapId = [NSNumber numberWithInt:];
content1.text = @"hello1"; Chapter *chapter1 = (Chapter *)[NSEntityDescription insertNewObjectForEntityForName:@"Chapter" inManagedObjectContext:context];
chapter1.name = @"hello1";
chapter1.orderId = [NSNumber numberWithInt:];
chapter1.chapId = [NSNumber numberWithInt:];
chapter1.myContent = content1; // 第二个章节
TextContent *content2 = [NSEntityDescription insertNewObjectForEntityForName:@"TextContent" inManagedObjectContext:context];
content2.chapId = [NSNumber numberWithInt:];
content2.text = @"hello2"; Chapter *chapter2 = (Chapter *)[NSEntityDescription insertNewObjectForEntityForName:@"Chapter" inManagedObjectContext:context];
chapter2.name = @"hello2";
chapter2.orderId = [NSNumber numberWithInt:];
chapter2.chapId = [NSNumber numberWithInt:];
chapter2.myContent = content2; // 书籍对象
Book *book = (Book *)[NSEntityDescription insertNewObjectForEntityForName:@"Book" inManagedObjectContext:context];
book.bookId = [NSNumber numberWithInt:];
book.name = @"hello";
book.author = @"Kitty";
book.summary = @"test";
[book addMyChaptersObject:chapter1];
[book addMyChaptersObject:chapter2]; // 提交到持久存储
if ([context hasChanges]) {
[context save:nil];
}
} // 读取对象
-(void) testRead
{
// 从AppDelegate 获得context
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = [appDelegate managedObjectContext]; // 生成查询对象 (查询全部数据)
NSEntityDescription *entityDescr = [NSEntityDescription entityForName:@"Book" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc]init];
[request setEntity:entityDescr]; // 执行查询
NSError *error;
NSArray *arrayBooks = [context executeFetchRequest:request error:&error]; // 定义排序方式 (根据集合中Chapter对象的orderId属性排序,升序)
NSSortDescriptor *chaptersDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"orderId" ascending:YES]; // 遍历结果集
for (Book *book in arrayBooks) { // 使用当前对象属性
NSLog(@"book name = %@", book.name); // 使用当前对象的集合属性,转成数组
NSArray *arrayChapters = [book.myChapters allObjects]; // 排序
arrayChapters = [arrayChapters
sortedArrayUsingDescriptors:[NSArray arrayWithObjects:chaptersDescriptor,nil]]; // 遍历子数组
for (Chapter *chapter in arrayChapters) {
NSLog(@"chapter name = %@", chapter.name); TextContent *content = (TextContent*) chapter.myContent;
NSLog(@"chapter text = %@", content.text);
}
}
} // 更新对象属性
-(void) testUpdate
{
// 从AppDelegate 获得context
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = [appDelegate managedObjectContext]; // 生成Request对象
NSEntityDescription *entityDescr = [NSEntityDescription entityForName:@"Book" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc]init];
[request setEntity:entityDescr]; // 执行查询
NSError *error;
NSArray *array = [context executeFetchRequest:request error:&error]; // 更改对象属性
Book * book = array[];
book.name = @"BOOKS"; // 提交到持久存储
if ([context hasChanges]) {
[context save:nil];
}
} // 删除对象
-(void) testRemove
{
// 从AppDelegate 获得context
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = [appDelegate managedObjectContext]; // 生成Request对象
NSEntityDescription *entityDescr = [NSEntityDescription entityForName:@"Book" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc]init];
[request setEntity:entityDescr]; // 执行查询
NSError *error;
NSArray *array = [context executeFetchRequest:request error:&error]; // 遍历删除对象,因为在模型里把关系设置为Cascade,所以子对象会被自动删除
for (Book *book in array) {
[context deleteObject:book];
} // 提交到持久存储
if ([context hasChanges]) {
[context save:nil];
}
}
iOS: Core Data入门的更多相关文章
- 《驾驭Core Data》 第二章 Core Data入门
本文由海水的味道编译整理,请勿转载,请勿用于商业用途. 当前版本号:0.4.0 第二章 Core Data入门 本章将讲解Core Data框架中涉及的基本概念,以及一个简单的Core Data ...
- Core Data入门
简介 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象. ...
- Core Data入门-备用
简介 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象. ...
- iOS:Core Data 中的简单ORM
我们首先在xcdatamodel文件中设计我们的数据库:例如我建立一个Data的实体,里面有一个String类型的属性name以及一个Integer类型的num: 然后选中Data,添加文件,选择NS ...
- Core Data 入门
1. 基本概念 Core Data是一种被称为对象关系映射(Object-Relational Mapping,ORM)技术的实现. Core Data 架构图如下: 五个概念: (1)数据模型(Da ...
- iOS Core data多线程并发访问的问题
大家都知道Core data本身并不是一个并发安全的架构:不过针对多线程访问带来的问题,Apple给出了很多指导:同时很多第三方的开发者也贡献了很多解决方法.不过最近碰到的一个问题很奇怪,觉得有一定的 ...
- IOS - CORE DATA的目录(xcode6)
当使用coredata作为app的后台数据存储介质后,我们很想知道数据是否成功插入.为此,我想找到coredata.sqlite的文件 代码中指定的存储目录为: - (NSURL *)appli ...
- iOS Core Data 数据库的加密(待研究)
https://github.com/project-imas/encrypted-core-data 使用起来很方便,底层还是使用了SQLCipher,有时间要研究一下! 数据库的密码不能用固定字符 ...
- 《驾驭Core Data》 第三章 数据建模
本文由海水的味道编译整理,请勿转载,请勿用于商业用途. 当前版本号:0.1.2 第三章数据建模 Core Data栈配置好之后,接下来的工作就是设计对象图,在Core Data框架中,对象图被表 ...
随机推荐
- 【转】Android Studio 的小小配置
这篇博文的内容列表: 1.编辑器的字体设置 2.预览XML布局 3.导入项目 4.显示行号 5.新建Java类和Component的子类 额~~程序猿一般话都不多,嘿嘿,那咱就直接图文吧~ ^_^ ...
- EasyUI-在行内进行表格的增删改操作
第一篇笔记中记录了如何实现表格的增删改,那个是点击之后跳出来一个对话框然后进行的,这里是在表格本身上进行的操作,也很简单,但是这里发现一个版本问题,也可以说是兼容性问题. 1.首先我们看引用的js和c ...
- C#调用java接口报“Fault occurred while processing”异常问题
服务在通常项目中总是要用到的C#的webservice.wcf,还有第三方的,比如java服务.一般来说调用都不会有什么问题,因为服务的标准都是一样的.要注意的就是:1.参数个数匹配:2.参数类型和返 ...
- PHP文件头部(header)解释
1. Accept:告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type. 2. Accept-Charset: 浏览器申 ...
- careercup-栈与队列 3.1
3.1 描述如何只用一个数组来实现三个栈. 解答 我们可以很容易地用一个数组来实现一个栈,压栈就往数组里插入值,栈顶指针加1: 出栈就直接将栈顶指针减1:取栈顶值就把栈顶指针指向的单元的值返回: 判断 ...
- Chapter 5 - How to Detect the Collisions
Chapter 5 - How to Detect the Collisions Our hero can fire bullets now, but the bullets are only vis ...
- PHP安全外延
接下来,我们讲一下:php语言与Apache等中间.MySQL等数据库结合使用时所产生的一些安全问题. 1.文件解析漏洞分析 2.编码注入漏洞分析 3.is_numeric漏洞分析
- RecyclerView实现瀑布流效果(图文详解+源码奉送)
最近有时间研究了一下RecyclerView,果然功能强大啊,能实现的效果还是比较多的,那么今天给大家介绍一个用RecyclerView实现的瀑布流效果. 先来一张效果图: 看看怎么实现吧: 整体工程 ...
- Android开发之显示进度对话框
一般有两种对话框,一个是普通的简单的please wait对话框,另一种是创建显示操作进度(如下载状态)的对话框. 第一种普通的效果图如下: 第一种普通的实现代码: public void onCli ...
- tar命令解压、压缩gz/bz2/xz文件
1.处理.tar.gz 压缩:tar zcf FILE.tar.gz FILEDIR 解压:tar zxf FILE.tar.gz 2.处理.tar.bz2 压缩:tar jcf FILE.tar.b ...