iphone开发之数据库CoreData

简介:

CoreData

介绍

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

 

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

 

CoreData有大量的特性,诸如支持RedoUndo的功能,这些很多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 FrameworkEOF)系统,但EOF中开发者可以使用相对简洁的查询方式,而在Core Data中,只能使用一个语法类似SQL子集的查询语言,称为PredicateCore 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{

         

         

}

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

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

    

}

 

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

         

    

        

 

3.         错误信息看不懂,用

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

{

         

         

}

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

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

         

         

         

         

         

         

         

         

         

         

}

 

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

NSFetchRequest *request = [[[NSFetchRequest allocinitautorelease];

         

         

         

         

         

 

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

         

         

         

                   

                   

                            if(找到) {

                                     更新对象数据等操作

[netData removeObject: data];

found = YES;

                            

}

         

         

移除不必要的数据等

         

}

for(id data in netData) {

         插入新增等操作

         

         最后是保存等操作

}

 

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

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

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










本文转自 arthurchen 51CTO博客,原文链接:http://blog.51cto.com/arthurchen/577937,如需转载请自行联系原作者

目录
相关文章
|
19天前
|
编解码 测试技术 iOS开发
iPhone 屏幕尺寸和开发适配
【10月更文挑战第23天】iPhone 的屏幕尺寸变化给开发者带来了一定的挑战,但也为创新提供了机遇。通过深入了解不同屏幕尺寸的特点,遵循适配原则和策略,运用合适的技巧和方法,我们能够为用户提供在不同 iPhone 机型上都具有良好体验的应用。在未来,随着技术的不断进步,我们还需要持续学习和适应,以满足用户对优质应用体验的不断追求。
|
7天前
|
存储 SQL API
探索后端开发:构建高效API与数据库交互
【10月更文挑战第36天】在数字化时代,后端开发是连接用户界面和数据存储的桥梁。本文深入探讨如何设计高效的API以及如何实现API与数据库之间的无缝交互,确保数据的一致性和高性能。我们将从基础概念出发,逐步深入到实战技巧,为读者提供一个清晰的后端开发路线图。
|
5天前
|
存储 缓存 NoSQL
2款使用.NET开发的数据库系统
2款使用.NET开发的数据库系统
|
8天前
|
存储 SQL 数据库
深入浅出后端开发之数据库优化实战
【10月更文挑战第35天】在软件开发的世界里,数据库性能直接关系到应用的响应速度和用户体验。本文将带你了解如何通过合理的索引设计、查询优化以及恰当的数据存储策略来提升数据库性能。我们将一起探索这些技巧背后的原理,并通过实际案例感受优化带来的显著效果。
27 4
|
17天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
34 2
|
17天前
|
监控 Java 数据库连接
在Java开发中,数据库连接管理是关键问题之一
在Java开发中,数据库连接管理是关键问题之一。本文介绍了连接池技术如何通过预创建和管理数据库连接,提高数据库操作的性能和稳定性,减少资源消耗,并简化连接管理。通过示例代码展示了HikariCP连接池的实际应用。
17 1
|
19天前
|
编解码 iOS开发 UED
响应式设计在 iPhone 开发适配中的具体应用
【10月更文挑战第23天】响应式设计在 iPhone 开发适配中扮演着至关重要的角色,它能够帮助我们打造出适应不同屏幕尺寸和用户需求的高质量应用。通过合理运用响应式设计的原则和方法,我们可以在提供良好用户体验的同时,提高开发效率和应用的可维护性。
|
26天前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
1月前
|
Rust 前端开发 关系型数据库
Tauri 开发实践 — Tauri 集成本地数据库
本文介绍了在 Tauri 框架中集成本地数据库的几种方案,包括直接绑定 SQLite、使用第三方数据库库和使用 tauri-plugin-sql-api 插件。最终选择了 tauri-plugin-sql-api,因为它集成简单、支持多种数据库类型,并且与 Tauri 框架深度整合,提升了开发效率和安全性。文章详细介绍了如何安装和使用该插件,以及如何编写核心代码实现数据库操作。
146 2
|
1月前
|
前端开发 Java 数据库连接
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
本文是一份全面的表白墙/留言墙项目教程,使用SpringBoot + MyBatis技术栈和MySQL数据库开发,涵盖了项目前后端开发、数据库配置、代码实现和运行的详细步骤。
43 0
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学