博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS: Core Data入门
阅读量:6261 次
发布时间:2019-06-22

本文共 7456 字,大约阅读时间需要 24 分钟。

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 
#import
#import "Book.h"#import "Chapter.h"#import "TextContent.h"@interface AppDelegate : UIResponder
@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:100];    content1.text = @"hello1";        Chapter *chapter1 = (Chapter *)[NSEntityDescription insertNewObjectForEntityForName:@"Chapter" inManagedObjectContext:context];    chapter1.name = @"hello1";    chapter1.orderId = [NSNumber numberWithInt:0];    chapter1.chapId =  [NSNumber numberWithInt:100];    chapter1.myContent = content1;        // 第二个章节    TextContent *content2 = [NSEntityDescription insertNewObjectForEntityForName:@"TextContent" inManagedObjectContext:context];    content2.chapId = [NSNumber numberWithInt:100];    content2.text = @"hello2";        Chapter *chapter2 = (Chapter *)[NSEntityDescription insertNewObjectForEntityForName:@"Chapter" inManagedObjectContext:context];    chapter2.name = @"hello2";    chapter2.orderId = [NSNumber numberWithInt:1];    chapter2.chapId =  [NSNumber numberWithInt:101];    chapter2.myContent = content2;        // 书籍对象    Book *book = (Book *)[NSEntityDescription insertNewObjectForEntityForName:@"Book" inManagedObjectContext:context];    book.bookId = [NSNumber numberWithInt:100];    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[0];    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];    }}

 

转载于:https://www.cnblogs.com/code-style/p/4016390.html

你可能感兴趣的文章
我为什么“放弃”从事八年的嵌入式领域
查看>>
TypeScript基础入门 - 函数 - 重载
查看>>
【ASP】当前星期几和月份名称输出
查看>>
好看的皮囊 · 也是大自然的杰作 · 全球高质量 · 美图 · 集中营 · 美女 · 2017-08-23期...
查看>>
小二,给我来一个递增序列
查看>>
images
查看>>
又一款开源手机要来了 —— WiPhone
查看>>
爬虫入门之反反爬虫机制cookie UA与中间件(十三)
查看>>
【飞天存储服务月报】2018年6月刊
查看>>
AJAX的一些硬知识
查看>>
第208天:jQuery框架封装(一)
查看>>
JNDIUtil、DBCPUtil、C3P0Util,三种数据源的工具类的区别?
查看>>
暴风魔镜裁员了,但是VR的春天依然在路上
查看>>
Java并发编程笔记之CyclicBarrier源码分析
查看>>
Weex在苏宁移动办公开发中是如何实践的?
查看>>
阿里倡导成立“罗汉堂”, 6名诺贝尔奖得主加入
查看>>
WebLogic 12c控制台上传获取webshell
查看>>
web3j 的 Infura Http 客户端
查看>>
[spring]03_装配Bean
查看>>
第116天: Ajax运用artTemplate实现菜谱
查看>>