CoreData简单使用

原创 2012年03月30日 21:08:11

苹果的CoreData框架(不限于)提供了一种数据持久化解决方案,它基于如下结构(图片来源苹果官网):

The Core Data Stack


其中涉及了几个概念:

NSManagedObject: 数据库中一条记录在内存的实例。

NSManagedObjectContext: 若干NSManagedObject在内存中的存在空间,或称上下文。除非该上下文执行save动作,否则数据变动一直限于内存中,并不会保存到文件。

NSManagedObjectModel: 数据库的模型表示,是若干数据表的集合。

NSPersistentObjectCoordinator: 作为中间层,根据NSManagedObjectModel帮我们协调不同格式的存储文件。


这里简单记录下CoreData的增、删、查动作。

首先,创建一个Data Model(一张RandomEvent表,包含两个字段,分别是randomNumber和createDate),并初始化:

- (void)initCoreData
{
    if (nil != self.managedObjectContext) {
        return ;
    }
    
    NSError *error = nil;
    NSString *savePath = [NSHomeDirectory() stringByAppendingString:@"/Documents/CDDemo.sqlite"];
    NSURL *saveUrl = [NSURL fileURLWithPath:savePath];
    
    NSManagedObjectModel *mom = [NSManagedObjectModel mergedModelFromBundles:nil];
    NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
    
    if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:saveUrl options:nil error:&error]) {
        NSLog(@"Error: %@", [error localizedDescription]);
    } else {
        self.managedObjectContext = [[[NSManagedObjectContext alloc] init] autorelease];
        [self.managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    
    [coordinator release], coordinator = nil;
}
这里选择的是sqlite格式。

接着,提供一个UITableView以供展示,和两个按钮来响应增删动作。如下图:

点击Add按钮,会生成一个随机数,将这个随机数和生成的时间一起写入数据库。

同时,当增加的记录条数够多的时候,UITableView会定位到新增记录。

- (void)onAddButtonItem:(id)sender
{
    RandomEvent *randomEvent = (RandomEvent *)[NSEntityDescription insertNewObjectForEntityForName:@"RandomEvent" inManagedObjectContext:self.managedObjectContext];
    randomEvent.createDate = [NSDate date];
    randomEvent.randomNumber = [NSNumber numberWithInt:arc4random() % 100];
    
    [self saveContext];
    [self refreshEventsList];
    
    if (1) {
        //tableView is not enough for the list to show
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:([self.fetchEventsResult count] - 1) inSection:0];
        [self.eventTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
    }
}


对NSManagedObjectContext的操作只是在内存中进行,需要执行save动作才写到本地文件。

- (BOOL)saveContext
{
    NSError *error;
	if (![self.managedObjectContext save:&error]) {
        NSLog(@"Error: %@", [error localizedDescription]);
        return NO;
    }
    return YES;
}


点击Edit按钮,会让UITableView进入编辑模式,让用户可以删除条目:

- (void)onEditButtonItem:(id)sender
{
    if ([self.eventTableView isEditing]) {
        UIBarButtonItem *editButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Edit" style:UIBarButtonItemStyleDone target:self action:@selector(onEditButtonItem:)];
        self.navigationItem.leftBarButtonItem = editButtonItem;
        [editButtonItem release], editButtonItem = nil;
        
        [self.eventTableView setEditing:NO animated:YES];
    } else {
        UIBarButtonItem *editButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(onEditButtonItem:)];
        self.navigationItem.leftBarButtonItem = editButtonItem;
        [editButtonItem release], editButtonItem = nil;
        
        [self.eventTableView setEditing:YES animated:YES];
    }
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSUInteger row = indexPath.row;
    
    if (row < [self.fetchEventsResult count]) {
        [self.managedObjectContext deleteObject:[self.fetchEventsResult objectAtIndex:row]];
        [self saveContext];
        [self refreshEventsList];
    }
}

最后,获取本地数据进行展示:

- (void)fetchEvents
{
    NSEntityDescription *entityDesctiption = [NSEntityDescription entityForName:@"RandomEvent" inManagedObjectContext:self.managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setEntity:entityDesctiption];
    
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"createDate" ascending:YES];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
    [sortDescriptor release], sortDescriptor = nil;
    
    NSError *error = nil;
    self.fetchEventsResult = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
    if (nil == self.fetchEventsResult) {
        NSLog(@"Error: %@", [error localizedDescription]);
    }
    
    [fetchRequest release], fetchRequest = nil;
}

#pragma mark - UITableView datasource

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.fetchEventsResult count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"RandomEventTableViewCell";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
    
    RandomEvent *randomEvent = (RandomEvent *)[self.fetchEventsResult objectAtIndex:indexPath.row];
    cell.textLabel.text = [NSString stringWithFormat:@"Random Number : %d", [randomEvent.randomNumber intValue]];
    
    return cell;
}


iOS开发-CoreData的简单使用

什么是CoreData? CoreData是iOS5之后才出现的一个框架, 它提供了对象-关系映射(ORM)的功能, 即能够将OC对象转换成数据, 保存在SQLite数据库文件中, 也能够将保存在数据...
  • lc_1581835288
  • lc_1581835288
  • 2015年12月28日 15:33
  • 904

CoreData—基础使用

创建自带CoreData的工程 在新建一个项目时,可以勾选Use Core Data选项,这样创建出来的工程系统会默认生成一些CoreData的代码以及一个.xcdatamodeld后缀的模型文...
  • ZH952016281
  • ZH952016281
  • 2016年08月09日 16:06
  • 1457

让CoreData更简单些

本文来自简书,原文地址:http://www.jianshu.com/p/78f6fe1eff07 前言 本文并不是CoreData从入门到精通之类的教程, 并不会涉及到过多的原理概念描述...
  • qq_30513483
  • qq_30513483
  • 2017年04月21日 08:51
  • 591

iOS 数据库篇(二) CoreData创建与使用

在上一篇博客iOS 数据库篇(一) CoreData 认识与入门—原理讲解篇,我们了解CoreData是什么,CoreData 的原理,结构以及它的优缺点.这篇文章,我们将会学习 CoreData 的...
  • wanna_dance
  • wanna_dance
  • 2017年06月21日 18:05
  • 606

Coredata — 入门使用

CoreData的底层实现虽然是使用的sqlite数据库,可是CoreData在使用起来可是和sqlite大相径庭,可能你会发现你连一句sql语句都不要写。CoreData存在于应用程序和持久化存储区...
  • magical_code
  • magical_code
  • 2016年04月09日 14:45
  • 2233

iOS CoreData之单表操作(增删改查)

CoreData框架, 具有一种对象关系映射机制, 即能够将OC对象转化为数据保存在SQLite(数据库)中, 同时也能够将SQLite中的数据还原为OC对象, 而在此相互转化过程中, 我们无需写繁琐...
  • Macro_13
  • Macro_13
  • 2015年11月02日 23:34
  • 1278

IOS之分析网易新闻存储数据(CoreData的使用,增删改查)

CoreData很强大,用起来很方便,是一个不错的存储数据的好方法。 1、网易新闻用CoreData存储了新闻列表,因为我打开网易新闻的Documents时看到了三个文件:newsapp.sqlite...
  • rhljiayou
  • rhljiayou
  • 2014年01月10日 14:14
  • 78013

CoreData使用详解

网上关于CoreData的教程能搜到不少,但很多都是点到即止,真正实用的部分都没有讲到,而基本不需要的地方又讲了太多,所以我打算根据我的使用情况写这么一篇实用教程。内容将包括:创建entity、创建r...
  • sky_2016
  • sky_2016
  • 2014年10月05日 19:38
  • 2736

关于CoreData的一个工具Mogenerator的使用

最近看到用CoreData时使用的工具Mogenerator,发现网上介绍其具体使用的不多,特此简单整理一下, 关于CoreData这里就不具体说了,使用就用MagicalRecord,用起来真是太...
  • meegomeego
  • meegomeego
  • 2014年01月16日 09:46
  • 2168

驾驭CoreData--第二章 Core Data入门

第二章 Core Data入门 本章将讲解Core Data框架中涉及的基本概念,以及一个简单的Core Data app的结构组成。          首先回忆一下,在你还没有使用Core Data...
  • sinat_25544827
  • sinat_25544827
  • 2015年05月24日 23:01
  • 1098
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CoreData简单使用
举报原因:
原因补充:

(最多只允许输入30个字)