数据持久化-CoreData、SQLite、FMDB
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了数据持久化-CoreData、SQLite、FMDB,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含18808字,纯文字阅读大概需要27分钟。
内容图文
![数据持久化-CoreData、SQLite、FMDB](/upload/InfoBanner/zyjiaocheng/1205/cd80823c9e4b4064b0fc972314220761.jpg)
1.CoreData
1.1 CoreData概述
1)Core data 是数据持久存储的最佳方式
2)Core Data 基于model-view-controller(mvc)模式下,为创建分解的cocoa应用程序提供了一个灵活和强大的数据模型框架。
3)Core Data可以是你以图形界面的方式快速的定义app的数据模型,同时在你的代码中容易获取到它。 Core Data提供了基础结构去处理常用的功能,例如:保存,恢复,撤销和重做,允许你在app中继续创建新的任务。在使用 Core Data的时候,你不用安装额外的数据库系统,因为 Core Data使用内置的SQLite数据库。(里面自动生成三个字段)
4)Core Data提供了一个通用的数据管理解决方案来处理那些所有需要数据模型的app,app使用 Core Data来管理数据对象时很多的益处
5) 苹果的图形用户界面编译器-interface builder(IB),提供了对core data controller对象的预构建,从而来减少app的用户界面和它的数据模型之间的粘滞代码。在使用core data的时候你不需要考虑sql的语法问题,也不需要管理相关的逻辑树去追踪用户的行为,更不用建立新的永久机制。当你写你app的用户界面到它的core data模型的时候,它已经为你把所有的东西都做好了。
6)core data将你app的模型层放入到一组定义在内存中的数据对象。core data会追踪这些对象的改变,同时可以根据需要做相反的改变,例如用户执行撤销命令。当core data在对你app数据的改变进行保存的时候,core data会把这些数据归档,并永久性保存。它保存的数据在一些常规的文件,你可以在Finder中可以进行管理,用spotlight进行搜索,备份到cd,和email给朋友或者家人。
7)在使用core data框架的时候,你可以创建一个管理对象的模型,该模型提供了对模型对象的抽象定义,这也就是我们所知道的entities,它可以在我们的程序中使用。
8)core data是一个实体-关系模型,该模型是使用Xcode的数据模型设计工具来定义的,对数据实体以及他们的关系提供了丰富的环境。
1.2 CoreData的构成及特点
1.2.1 数据最终的存储类型
SQLite数据库,XML,二进制,内存里,或自定义数据类型(在Mac OS X 10.5Leopard及以后的版本中,开发者也可以通过继承NSPersistentStore类以创建自定义的存储格式)
1.2.2 好处
能够合理管理内存,避免使用sql的麻烦,高效
1.2.3 构成
1)NSManagedObjectContext(被管理的数据上下文)
操作实际内容(操作持久层)
作用:插入数据,查询数据,删除数据
2)NSManagedObjectModel(被管理的数据模型)
数据库所有表格或数据结构,包含各实体的定义信息
作用:添加实体的属性,建立属性之间的关系
操作方法:视图编辑器,或代码
3)NSPersistentStoreCoordin
相当于数据库的连接器
作用:设置数据存储的名字,位置,存储方式,和存储时机
4)NSManagedObject(被管理的数据记录)
相当于数据库中的表格记录
5)NSFetchRequest(获取数据的请求)
相当于查询语句
6)NSEntityDescription(实体结构)
相当于表格结构
7)后缀为.xcdatamodeld的包
里面是.xcdatamodel文件,用数据模型编辑器编辑
编译后为.momd或.mom文件
1.2.4 依赖关系
和SQLite的区别:只能取出整个实体记录,然后分解,之后才能得到实体的某个属性
1.3.1 构建流程
包括:创建数据上下文,创建数据模型,创建数据持久化存储助理
(1)若是新建的工程,选择空白应用程序,next
此时生成的工程文件AppDelegate中,会自动生成被管理的数据上下文等相关代码
(2)比如AppDelegate.h文件中,自动生成
@property ( readonly , strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property ( readonly , strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (
readonly
, strong, nonatomic) NSPersistentStoreCoordin
- ( void )saveContext;
-
(NSURL *)applicationDocumentsDire
ctory;
方法saveContext表示:保存数据到持久层(数据库)
方法applicationDocumentsDire
(例如/var/mobile/Applications/5FG80A45-DFB5-4087-A1B1-41342A977E21/Documents/)
(3)比如AppDelegate.h文件中,自动生成
@synthesize managedObjectContext = __managedObjectContext;
@synthesize managedObjectModel = __managedObjectModel;
@synthesize
persistentStoreCoordinat
保存数据到持久层
- (
void
)applicationWillTerminate
{
}
- ( void )saveContext
{
}
Documents目录路径
- (NSURL *)applicationDocumentsDire
{
}
被管理的数据上下文
初始化的后,必须设置持久化存储助理
- (NSManagedObjectContext *)managedObjectContext
{
}
被管理的数据模型
初始化必须依赖.momd文件路径,而.momd文件由.xcdatamodeld文件编译而来
- (NSManagedObjectModel *)managedObjectModel
{
}
持久化存储助理
初始化必须依赖NSManagedObjectModel,之后要指定持久化存储的数据类型,默认的是NSSQLiteStoreType,即SQLite数据库;并指定存储路径为Documents目录下,以及数据库名称
- (NSPersistentStoreCoordin
{
}
如果不是新工程,也可以自己写入相关代码
(4)此外还生成了TestApp.xcdatamodeld文件
(5)还自动链接了CoreData.framework
(6)在预编译头.pch文件中,加入导入了CoreData.h头文件
#import
1.3.2 创建数据模型(数据模型编辑器操作)
(1)创建实体(数据库表)和实体间的关系
选中.xcodedatamodel对象
在左下脚点击Add Entity添加实体
选中新添加的属性,对属性进行命名,并设置属性的数据类型Attribute Type
选中一个实体,在底部工具栏点击Add Relationship添加关系
(2)自动生成模型类
选择你要创建的数据对象
1.3.3 数据模版
为每个实体生成一个NSManagedObject子类
上面设置数据和获取数据时,使用的是Key-Value方式,更好的方法是通过生成强类型的NSManagedObject的子类,通过类的成员属性来访问和获取数据
(1)在数据编辑器视图中选中实体对象,
选则file菜单,点击new,点击file...,选择Core Data项,选择NSManagedObject subclass,生成该实体同名的类,
继承于NSManagedObject
- 生成对应的.h文件
- 生成对应的l.m文件
其中,@dynamic告诉编译器不做处理,使编译通过,其getter和setter方法会在运行时动态创建,由Core Data框架为此类属性生成存取方法
1.3.4 插入数据
在AppDelegate.m的application:didFinishLaunchingWithOp
insertCoreData插入数据,代码如下:
- ( void )insertCoreData
{
}
创建数据上下文,调用insertNewObjectForName方法,创建两个数据记录NSManagedObject,然后就可以对之前数据模型编辑视图中定义的属性进行赋值。此时的数据只在内存中被修改,最后调用数据上下文的save方法,保存到持久层
1.3.5 查询数据
在调用了insertCoreData之后,可以调用自定的查询方法dataFetchRequest来查询插入的数据
- ( void )dataFetchRequest
{
}
fetchRequest相当于sql查询语句的包装类,需要用setEntity方法,来指定具体查询的实体结构(表结构)
通过NSEntityDescription的entityForName方法来,返回指向该具体实体结构的指针
然后调用executeFetchRequest:error:方法,来执行查询操作,如果操作成功,则返回对应的数据记录数组
其中,可以通过NSManagedObject数据记录对象里关联的属性,查询另一个数据记录对象里的属性
之前用Key-Value的代码就可以修改为:
#import "School.h"
#import "Student.h"
- ( void )insertCoreData
{
}
- ( void )dataFetchRequest
{
}
1.3.6 数据库相关
1)打印隐藏的sql语句:
在Edit Scheme中选择Run,之后进入Arguments标签,添加参数:“-com.apple.CoreData.SQLDebug 1”
2)使用SQLite存储时,数据库结构
存储的SQLite数据库表名称:大写“Z”加上实体名称大写,一个实体相当于一张表
具体的字段名称:大写“Z”加上实体属性名称大写
2.SQLite
mac os x中SQLite库,它是一个轻量级功能强大的关系数据引擎,也很容易嵌入到应用程序。可以在多个平台使用,SQLite是一个轻量级的嵌入式sql数据库编程。与core data框架不同的是,SQLite是使用程序式的,sql的主要的API来直接操作数据表。
SQLite3是一个非常灵活的数据库系统,没有数据库服务器的概念,这应该算是回归了比较传统的数据库设计。
早期我们的数据都是直接存放在文件系统,由于简单的文件系统存在数据冗余、不一致、读取操作繁琐(每个数据结构都可能要编写自己的读写程序)等,慢慢形成了数据库管理系统,一套完整的数据库理论。
目前较为流行的Oracle, SqlServer, MySql等数据库系统均是服务器-客户端的概念,数据库服务器负责所有的数据管理、权限管理等,客户端按照一定格式发出请求即可。
sql则是较为流行的结构化查询语言,为众多上层应用提供简单方便的数据库读写操作等。
但是可想而知,服务器端必定是需要对sql请求进行解析然后执行的,那么这些执行程序还得回归更底层的语言,比如C&C++的实现。
注意:
2.1 建立SQLite3.0数据库
在Firefox中打开SQLite3(如果没有,选择工具->附加组件,添加即可)新建SQLite3数据库,Contacts,
建立一个members表,字段 id,integer,主键,自增;name,varchar;email,varchar,null;birthday,datetime,null。
向表中添加一些数据:
2.2 SQLite使用代码
新建Empty Appliation,添加一个HomeViewController,和一个组件libSQLite3.dylib,来支持对SQLite3的连接,关闭,增删改查等操作。
1.)HomeViewController.h代码:
#import
#import "SQLite3.h"
@interface HomeViewController : UIViewController{
}
- (NSString *)filePath;//数据库文件的路径。一般在沙箱的Documents里边操作
@end
2.)HomeViewController.m代码:
@interface HomeViewController ()
@end
@implementation HomeViewController
//该方法用于返回数据库在Documents文件夹中的全路径信息
- (NSString *)filePath{
}
//打开数据库的方法
- (void)openDB{
}
//插入数据方法
- (void)insertRecordIntoTableNam
}
//查询数据
- (void)getAllContacts{
}
- (void)viewDidLoad
{
}
@end
插入数据后的效果:
查询的效果:
2.3 小结:
3.FMDB
FMDB框架其实只是一层很薄的封装,主要的类也就两个:FMDatabase和FMResultSet。在使用FMDB的时候还需要导入libSQLite3.0.dylib。
在FMDB下载文件后,工程中必须导入如下文件,并使用
FMDB同时兼容ARC和非ARC工程,会自动根据工程配置来调整相关的内存管理代码。
FMDB常用类:
FMDatabase : 一个单一的SQLite数据库,用于执行SQL语句。
FMResultSet :执行查询一个FMDatabase结果集,这个和android的Cursor类似。
FMDatabaseQueue :在多个线程来执行查询和更新时会使用这个类。
3.1 数据基本操作
1) 创建数据库:
db
2) 打开数据库:
[db
返回BOOL型。
3) 关闭数据库:
[db
3.2 数据库增删改等操作:
除了查询操作,FMDB数据库操作都执行executeUpdate方法,这个方法返回BOOL型。
看一下例子:
1)创建表:
if
}
2)添加数据:
if
}
3)修改数据:
if
4)删除数据:
if
5)数据库查询操作:
查询操作使用了executeQuery,并涉及到FMResultSet。
if
FMDB的FMResultSet提供了多个方法来获取不同类型的数据:
3.3 数据库多线程操作:
FMDatabaseQueue
4.总结
- CoreData允许用户使用代表实体和实体间关系的高层对象来操作数据。它也可以管理串行化的数据,提供对象生存期管理与object_graph 管理,包括存储。Core Data直接与SQLite交互,避免开发者使用原本的SQL语句.
- 上面的三种,都是在什么情况下使用呢?大多数人肯定是根据自己使用某项技术的时间也就是掌握的熟练程度来决定,例如以前没用过CoreData,在编写ios程序的时候还是使用自己比较拿手的SQLite,或者可能会考虑到在使用coredata自己还要花费额外的时候去学习。
- 但是仔细想一想,CoreData是苹果自己弄的框架,它其实还是和SQLite进行交互的,只是在交互的时候或者处理数据的时候进行了很多的优化,CoreData可以缩小你的代码量,而且CoreData已经优化过很多个版本,还提供了出色的安全性和错误处理之外,还提供了对任何竞争性方案的最好的内存可扩展性。换句话说就是,你可能花费了很长时间为某个问题进行优化精心制作了一个方案,但是在性能上的优势和CoreData相比,还是相差深远的。
- 另外就是CoreData与Mac OS X的集成非常的好,CoreData也和IB进行了结合,允许你创建用户界面,这样可以帮助你缩短应用程序的设计,实施以及调试周期。
- 所以在编写程序的时候尽量使用CoreData,这样才是最优的选择。只有在Core Data is available on iOS
3.0 and later才能使用CoreData。
- 至于SQLite和FMDB的使用情况,这个看个人喜好了,个人觉得没什么标准。FMDB就是对SQLite的封装,使用起来有方便的接口,没那么麻烦而已。
原文:http://blog.csdn.net/u011374880/article/details/41520393
内容总结
以上是互联网集市为您收集整理的数据持久化-CoreData、SQLite、FMDB全部内容,希望文章能够帮你解决数据持久化-CoreData、SQLite、FMDB所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。