CoreData

介绍

在Cocoa环境下,如果你想使用数据库(如sqlite),你可以使用sql语句的方式通过相关的工具类进行数据库的直接操作。当然你也可以通过别人封装之后的一些简单框架,使得你的操作更加简单(如FMDB BNRPersistence)。

Cocoa框架本身提供了CoreData这个API可方便的让开发者通过操作对象的方式在操作数据库。CoreData是一个对象图(object graph)以及持久化的管理框架。我们可以通过CoreData创对象,设置好象之间的关系,然后将其持久化(我们甚至可以使用内存数据库),或者从硬盘上将持久化后的数据加载到内存中。对象图,我们可以创建一个个的对象,并维持不同对象之间的关系,一对一,一对多等。

CoreData有大量的特性,诸如支持Redo,Undo的功能,这些很多Document based的程序中显得非常的有用。提供数据model结构变化轻量级的迁移方案。CoreData还通过Binding特性和控件的紧密结合,这样使得只需要少量的代码便可以完成强大的功能,下面是一个例子

http://www.timisted.net/blog/archive/multiple-windows-with-core-data/

存储方式

Core Data可以将数据存储为XML,二进制文件或SQLite文件。在Mac OS X 10.5 Leopard及以后的版本中,开发者也可以通过继承NSPersistentStore类以创建自定义的存储格式。每种方法都有其优缺点,例如XML的可读性,SQLite的节约空间等。

Core Data的这一方面类似于原始的Enterprise Objects Framework(EOF)系统,但EOF中开发者可以使用相对简洁的查询方式,而在Core Data中,只能使用一个语法类似SQL子集的查询语言,称为Predicate。Core Data是标准化的,可以自由的读写Xcode数据模型文件(通常是.xcdatamodel文件)。

与EOF不同,Core Data目前没有设计多用户或多线程访问模式。模型迁移通常也需要代码,若其它开发者依赖于某个数据模型,则该数据模型的设计者可能在模型发生改变时需要与新数据模型一起提供版本转换代码。

操作简介

Core Data由相对庞大的类继承体系组成,但开发者需要关注的接口只是其中的一个相对小的子集。

一般需要定义以下Core Data的三个必备

NSPersistentStoreCoordinator *persistentStoreCoordinator;

NSManagedObjectModel *managedObjectModel;

NSManagedObjectContext *managedObjectContext;

以及使用时需要用到的

NSFetchedResultsController *fetchedResultsController;

具体的使用例子比较多,后面介绍一下在使用过程中遇到的一些问题。或许可以帮到你。

分享

1.         使用Table时在3.0版本时会Crash

- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section{

id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];

return [sectionInfo numberOfObjects];

}

3.0版本的时候如果你在numberOfRowsInSection的回调时Crash,那么加上下面这个回调就没事了,这样在无数据的时候数组就不会越界了。Apple在3.0才第一次上CoreData,总有不小心的时候,后面的版本就处理得很好。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

return [[self.fetchedResultsController sections] count];

}

2.         又Crash了,检查一下,记得在所有增删改查前已经调用过下面这几句话,并且在重置fetchedResultsController 的时候也要重新调用,所以我把它写到创建的尾部了。

NSError *error;

if (![fetchedResultsController performFetch:&error])

NSLog(@"Error performing fetch: %@", [error localizedDescription]);

3.         错误信息看不懂,用

- (void) handleError:(NSError *)error fromSource:(NSString *)sourceString

{

NDLOG(@"Unresolved error %@ at %@, %@", error, sourceString, [error userInfo]);

[DataController dumpError:error];

}

打出来的确实不是很清楚。有时候还是不准确不完整的信息。换一个吧,我们自己来。

+ (void) dumpError:(NSError *) error {

NDLOG(@"Failed to save to data store: %@", [error localizedDescription]);

NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];

if(detailedErrors != nil && [detailedErrors count] &gt; 0) {

for(NSError* detailedError in detailedErrors) {

NDLOG(@"  DetailedError: %@", [detailedError userInfo]);

}

}

else {

NDLOG(@"  %@", [error userInfo]);

}

}

4.         不是每次都要fetchedResultsController的,有时候直接用NSFetchRequest更方便。

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];

NSEntityDescription *tagEntity = [NSEntityDescription entityForName:@"entityName" inManagedObjectContext:managedObjectContext];

[request setEntity:tagEntity];

NSError *error = nil;

NSArray *array = [managedObjectContext executeFetchRequest:request error:&error];

return [array count];

5.         有时候没SQL命令确实效率不怎么样。为了做一个更新数据库的操作,瞧这代码,幸亏N都是很小的值。

NSMutableArray* persistent = [NSMutableArray arrayWithArray:local];

NSMutableArray* netData = [NSMutableArray arrayWithArray:netReturn];

for(id info in persistent) {

BOOL found = NO;

for(id data in netData) {

if(找到) {

更新对象数据等操作

[netData removeObject: data];

found = YES;

break;

}

}

if(!found) {

移除不必要的数据等

}

}

for(id data in netData) {

插入新增等操作

}

最后是保存等操作

}

6.         在使用的过程中,其功能强大省去了很多的事情,但是其实有很多需要注意的东西吗,delegate的处理等等。在改变模型的时候如果没有更新方案的话会很麻烦的。效率上也是值得商榷,还有一堆高度重复的代码也是看起来不舒服的地方。还有就是感觉数据源非常适合使用Table来处理。

7.         在上面的第五点的更新操作为什么需要这样子麻烦呢,因为需要避免用户在操作一个数据库中一个已经被删除的但是已经载到内存中对象。但是这种情况并没有能够完全规避,这时候在访问对象数据前,需要及时的判断这个内存中的对象还有效吗。调用对象的isFault(NSManagedObject),进行判断,及时避免不必要的操作和崩溃。

1.         http://blog.jjgod.org/2010/02/28/core-data-or-not/  是否该用 Core Data。在IOS上使用数据库的一点不同的声音。

转载于:https://blog.51cto.com/arthurchen/577937

iphone开发之数据库CoreData相关推荐

  1. CSDN上Android与IPhone开发博客精选

    Android [1] 张国威:Android从入门到提高系列 前面写了十四篇关于界面的入门文章,大家都看完和跟着练习之后,对于常用的Layout和View都会有一定的了解了,接下来的文章就不再强调介 ...

  2. 学习iPhone开发中 sqlite3的使用

    由于我主要负责我们小组项目数据库模块的部分所以这几天都一直在研究在iphone中最为常用的一个简单数据库sqlite,自己也搜集很多资料,因此在这里总结一下这几天的学习成果: 1.Sqlite操作简明 ...

  3. iPhone开发进阶(9)--- 用SQLite管理数据库

    博主:易飞扬 原文链接 : http://www.yifeiyang.net/iphone-developer-advanced-9-management-database-using-sqlite/ ...

  4. iPhone开发进阶(1) --- 深入理解iPhone OS/SDK与Objective-C 2.0

    iPhone开发进阶(1) --- 深入理解iPhone OS/SDK与Objective-C 2.0 工欲善其事,必先利其器.在开发iPhone应用程序的时候,深入理解iPhone OS/SDK与O ...

  5. iphone开发我的新浪微博客户端-用户登录准备篇(1.1)

    首先说一下我这个的实现思路,登录支持多个账号,也就是说可以保存多个微博账号登录的时候选择其中一个登录.多个账号信息保存在sqlite的数据库中, 每一个账号信息就是一条记录, 当用户启动微博客户端的时 ...

  6. iphone开发杂谈

    很久没看到这么好的文章了,此文摘自StackOverflow的翻译,献给iphone开发的同仁们,同时也给自己做个笔记- 192个加分的回答: 有些初学时的做法,现在我认为是不标准的. 1) 有了pr ...

  7. iphone开发笔记和技巧总结

    在iphone程序中实现截屏的一种方法: //导入头文件   #importQuartzCore/QuartzCore.h //将整个self.view大小的图层形式创建一张图片imageUIGrap ...

  8. iPhone开发秘笈pdf

    下载地址:网盘下载 内容简介  · · · · · · 本书提供了关于iPhone SDK 以及iPhone 开发的全面信息,对iPhone SDK 中的各种组件做了深入浅出的介绍,包括iPhone ...

  9. iphone开发 IOS 组织架构图

    转载自 :http://blog.csdn.net/mashi321323/article/details/18267719 登录 | 注册 mashi321323的专栏 目录视图 摘要视图 订阅 1 ...

最新文章

  1. 2021-春季学习-智能车技术创新与实践-Lesson3
  2. js json编辑器_程序员必备编辑器 —— Visual Studio Code
  3. AndroidStudio gradle配置
  4. DHCP协议执详解,DHCP协议执行流程、配置方式
  5. python怎么在运行中查看执行状态_python,_python程序运行时 查看对象状态,python - phpStudy...
  6. Ubuntu安装php
  7. setState的参数接收函数
  8. 通信原理及系统系列3—— 基于卷积编码的2ASK通信系统设计(非相干解调)
  9. Python 处理视频文件
  10. #151 – Dependency Properties Remember Non-Coerced Values(依赖属性强制转换之前的值会被记住)
  11. 如何快速删除 Word 文档中的分节符
  12. Oracle 分页方法研究
  13. mpeg1视频解码标准简介
  14. linux安装ie浏览器吗,Ubuntu上安装IE浏览器的方法有哪些 安装方法分享
  15. Python制作桑基图
  16. 典型的计算机串行和并行总线,串行总线和并行总线的区别
  17. 软件构造——浅谈正则表达式
  18. C#语言实例源码系列-实现加密bat文件
  19. 推荐系统(1)——先做一个出来(先实战,后理论)
  20. SEO全称:Search Engine Optimization,即搜索引擎优化

热门文章

  1. matlab 分段式规范作图
  2. python3.6+pytorch-cpu+Pycharm环境下的PyTorch配置方法
  3. FPGA之道(46)数字电路中的隐患
  4. FPGA之道(9)BLOCK RAM以及DSP硬核
  5. FPGA之道(3)数字系统之间的接口电平标准
  6. HDLBits 系列(17) 计数器的级联实现1000分频的分频器
  7. 2017北京云栖大会:云效企业级协同研发专场议题揭秘!
  8. linux命令简单汇总,直通车
  9. Oracle动态采样学习
  10. 如何配置windows下的snmp服务