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框架中,对象图被表 ...
随机推荐
- UVA 297 Quadtrees(四叉树建树、合并与遍历)
<span style="font-size: 18pt; font-family: Arial, Helvetica, sans-serif; background-color: r ...
- Request的getParameter和getAttribute方法的区别
下面整理一下getParameter和getAttribute的区别和各自的使用范围. (1)HttpServletRequest类有setAttribute()方法,而没有setParam ...
- 手把手教你从Core Data迁移到Realm
来源:一缕殇流化隐半边冰霜 (@halfrost ) 链接:http://www.jianshu.com/p/d79b2b1bfa72 前言 看了这篇文章的标题,也许有些人还不知道Realm是什么,那 ...
- WTL的消息机制
Windows消息 众所周知,Windows消息有两种:队列话消息和非队列话消息.队列话消息是被Windows操作系统放入消息队列的,程序通过主消息循环不断的从消息队列中取出消息并分发到各自的窗体调用 ...
- android 中 ColorDrawable dw = new ColorDrawable(0x3ccccccc),关于颜色定义的总结
android 中 ColorDrawable dw = new ColorDrawable(0x3ccccccc),关于颜色定义的总结 0x3ccccccc 拆分开来 0x-3c-cccccc ...
- codeforces 148D Bag of mice(概率dp)
题意:给你w个白色小鼠和b个黑色小鼠,把他们放到袋子里,princess先取,dragon后取,princess取的时候从剩下的当当中任意取一个,dragon取得时候也是从剩下的时候任取一个,但是取完 ...
- Eclipse将项目部署tomcat的webapps目录
Eclipse将项目部署tomcat的webapps目录 >>>>>>>>>>>>>>>>>& ...
- 第五篇:web之前端之float的几种清除浮动方式
前端之float的几种清除浮动方式 前端之float的几种清除浮动方式 本节内容 1.float清除方式1 2.float清除方式2 3.float清除方式3 4.float清除方式4 1.flo ...
- PHP验证码的制作
<?phpsession_start(); //??session//?建随机?,并保存在session中for($i=0;$i<4;$i++){$_nmsg.=dechex(mt_r ...
- [DEncrypt] Encrypt--加密/解密/MD5加密 (转载)
点击下载 Encrypt.zip 这个类是关于加密,解密的操作,文件的一些高级操作1.Encrypt加密2.Encrypt解密3.Encrypt MD5加密看下面代码吧 /// <summar ...