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: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];
    }
}
时间: 2024-10-04 00:10:37

iOS: Core Data入门的相关文章

iOS Core data多线程并发访问的问题

大家都知道Core data本身并不是一个并发安全的架构:不过针对多线程访问带来的问题,Apple给出了很多指导:同时很多第三方的开发者也贡献了很多解决方法.不过最近碰到的一个问题很奇怪,觉得有一定的特殊性,与大家分享一下. 这个问题似乎在7.0.1以前的版本上并不存在:不过后来我升级版本到了7.0.4.app的模型很简单,主线程在前台对数据库进行读写,而后台线程不断地做扫描(只读).为此每个线程中各创建了一个NSManagedObjectContext. 这个模型其实有点奇怪,因为普遍的模型是

Core Data入门

Core Data入门 标签: Core DataiosiOSIOS数据存取数据库数据持久化 简介 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象.在此数据操作期间,我们不需要编写任何SQL语句,这个有点类似于著名的Hibernate持久化框架,不过功能肯定是没有Hibernate强大的.简单地用下图描述下它的作用: 左边是关系模型,即数据库,数据库里

IOS - CORE DATA的目录(xcode6)

? ?当使用coredata作为app的后台数据存储介质后,我们很想知道数据是否成功插入.为此,我想找到coredata.sqlite的文件 代码中指定的存储目录为: - (NSURL *)applicationDocumentsDirectory { ? ? ? return [[[NSFileManagerdefaultManager] URLsForDirectory:NSDocumentDirectoryinDomains:NSUserDomainMask] lastObject]; }

iOS Core Data 数据迁移 指南

前言 Core Data是iOS上一个效率比较高的数据库框架,(但是Core Data并不是一种数据库,它底层还是利用Sqlite3来存储数据的),它可以把数据当成对象来操作,而且开发者并不需要在乎数据在磁盘上面的存储方式.它会把位于NSManagedObject Context里面的托管对象NSManagedObject类的实例或者某个NSManagedObject子类的实例,通过NSManagedObjectModel托管对象模型,把托管对象保存到持久化存储协调器NSPersistentSt

iOS Core Data的returnsObjectsAsFaults属性

来自论坛的一个问题:[CoreData] returnsObjectsAsFaults是什么用的. 这个属性是用来做优化的,但是有时候反而会降低性能,我跟你打个简单的比方,假如你有一个Department对象,它和Employee对象是一对多的关系(比如一个部门有100个员工),当你加载Department的时候,它包含的所有Employee也被加载了,此时如果returnsObjectsAsFaults为YES,则员工们不会被添加到内存中,而是被放在了row cache里,Department

iOS Core Data: 存储自定义对象 Save Custom NSObject

思路:将NSObject转化为NSData,然后将NSData存入到Core Data中 Core Data实现 添加数据: AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; NSManagedObjectContext *context = [appDelegate managedObjectContext]; NSManagedObject *newContact; newContact = [N

[iOS] Core Data 代码速查表

文中代码均来源于:http://www.appcoda.com/introduction-to-core-data/ 希望学习 Core Data 的同学不要错过:)以下是我个人记录的一些常用代码片段. 有一个 Entity:Device,有三个属性:company.name.version. 1.获取 context 的方法: - (NSManagedObjectContext *)managedObjectContext { NSManagedObjectContext *context =

Core Data-备用

Core Data是一个功能强大的层,位于SQLite数据库之上,它避免了SQL的复杂性,能让我们以更自然的方式与数据库进行交互.Core Data将数据库行转换为OC对象(托管对象)来实现,这样无需任何SQL知识就能操作他们. Core Data位于MVC设计模式中的模型层,一般需要在设备上存储结构化数据时,考虑使用SQLite或是序列化等方法,而Core Data是这两种方法的混合体,并增加了一些功能,提供了SQL强大威力,但是用起来又和序列化一样简单.Core Data能将应用程序中的对象

ios开发:Core Data概述

Core Data 概述 2005年的四月份,Apple 发布了 OS X 10.4,在这个版本中 Core Data 框架发布了.Core Data本身既不是数据库也不是数据库访问框架.相反,Core Data是一个完整的数据模型解决方案.可以简单理解为对持久层的封装,使得我们可以通过可视化建立数据模型,简化数据存取.即使不懂SQL语句,也依然可以使用Core Data.因为Core Data将底层的数据库SQL语句封装成了一套API,并可通过可视化操作来建立数据库的模型和表之间的关系,它甚至