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,如需转载请自行联系原作者

目录
相关文章
|
21天前
|
SQL 数据库
数据库开发之子查询案例的详细解析
数据库开发之子查询案例的详细解析
13 0
|
21天前
|
SQL 数据库
数据库开发之子查询的详细解析
数据库开发之子查询的详细解析
18 0
|
3天前
|
数据库
基于Jeecgboot前后端分离的ERP系统开发数据库设计(二)
基于Jeecgboot前后端分离的ERP系统开发数据库设计(二)
|
3天前
|
数据库
基于Jeecgboot前后端分离的ERP系统开发数据库设计(一)
基于Jeecgboot前后端分离的ERP系统开发数据库设计(一)
|
12天前
|
Java 关系型数据库 MySQL
springboot业务开发--springboot一键生成数据库文档
Screw是一个数据库文档生成工具,能自动化根据数据库表结构生成文档,减轻开发人员工作负担,支持MySQL、MariaDB、TiDB等多种数据库和HTML、Word、Markdown等格式。它依赖HikariCP数据库连接池和Freemarker模板引擎。通过在Spring Boot项目中添加相关依赖并配置,可以用代码或Maven插件方式生成文档。示例代码展示了如何在JUnit测试中使用Screw生成HTML文档。
|
13天前
|
安全 关系型数据库 MySQL
【PHP开发专栏】PHP PDO与MySQLi操作数据库
【4月更文挑战第30天】PHP数据库交互的核心是PDO和MySQLi。PDO提供数据访问抽象层,支持多种数据库,强调安全和灵活性;MySQLi则专为MySQL设计,有面向对象和过程化接口。两者都支持预处理语句,防止SQL注入。选择取决于项目需求,如可移植性、特定功能和API偏好。了解其使用有助于编写安全高效的代码。
|
13天前
|
关系型数据库 MySQL PHP
【PHP 开发专栏】PHP 连接 MySQL 数据库的方法
【4月更文挑战第30天】本文介绍了 PHP 连接 MySQL 的两种主要方法:mysqli 和 PDO 扩展,包括连接、查询和处理结果的基本步骤。还讨论了连接参数设置、常见问题及解决方法,如连接失败、权限和字符集问题。此外,提到了高级技巧如使用连接池和缓存连接信息以优化性能。最后,通过实际案例分析了在用户登录系统和数据管理中的应用。
|
13天前
|
SQL 关系型数据库 MySQL
【PHP开发专栏】PHP与数据库交互入门
【4月更文挑战第29天】本文介绍了PHP与数据库交互的基础,包括选择MySQL或PostgreSQL等关系型数据库,使用MySQLi或PDO扩展进行连接。示例展示了如何使用PHP连接数据库,如MySQLi的面向对象连接方式和PDO的多数据库支持。此外,还讲解了执行SQL查询(如SELECT、INSERT、UPDATE、DELETE)的操作,并强调了安全性与错误处理,如使用预处理语句防止SQL注入。通过学习,读者可掌握PHP操作数据库的基本技能。
|
21天前
|
SQL 存储 关系型数据库
数据库开发之事务和索引的详细解析
数据库开发之事务和索引的详细解析
16 0
数据库开发之事务和索引的详细解析
|
21天前
|
SQL 数据库
数据库开发之内连接和外连接的详细解析
数据库开发之内连接和外连接的详细解析
11 0