阐述对core data 与sqlite之间关系的理解

本文介绍了CoreData与SQLite数据库之间的关系,CoreData并非严格意义上的SQLite封装,而是提供了更高级别的数据管理框架。文章通过对比SQLite的基本操作与CoreData的类对应关系,帮助理解CoreData的架构,并提到在Core Data应用中如何使用原生SQL功能来处理复杂查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 本文大部分属于转载,只是提供一些编辑。但是看完这个内容以后,楼主这个小菜鸟理解了一下core data ,故和大家分享一下,一家之间,谨慎拍砖

CoreData 框架的简单解释  
并非严格的说, CoreData是对sqlite数据库的一个封装。  
 
sqlite数据库操作的基本流程是, 创建数据库, 再通过定义一些字段来定义表格结构, 可以利用sql语句向表格中插入记录, 删除记录, 修改记录, 表格之间也可以建立联系。 
 
这个过程出现了, 表格的结构(schema), 所有表格的结构和相互联系构成整个数据库的模型, 数据库存放的方式(可以是文件或者在内存), 数据库操作, sql语句(主要是查询), 表格里面的记录。  
 
下面将上面说的文字, 跟CoreData的类作个对应:  
 
表格结构    --> NSEntityDescription  
数据库中所有表格和他们的联系 -->NSManagedObjectModel  
数据库存放方式 --> NSPersistentStoreCoordinator  
数据库操作 --> NSManagedObjectContext  
查询语句 --> NSFetchRequest  
表格的记录 --> NSManagedObject  
 
可能上面的对应关系并非十分严格, 但确实可以帮助理解.  
 
下面再看看CoreData的类  
NSEntityDescription  
NSManagedObjectModel  
 
NSEntityDescription用来定义表格结构, 所以你就可以理解NSManagedObjectModel中的setEntities:(NSArray *)entities函数大概有什么用了 . 通常, 定义model, 是用文件CoreData.xcda*****odel, 可以图形化的操作. 这类似用nib来创建界面.  
 
建个工程, 使用coredata, 模拟器运行之后, 程序对应的document目录出现一个CoreData.sqlite. 可以利用sqlite3命令来查看里面的表格结构  
用命令行sqlite3 CoreData.sqlite 进入  
>.tables  
ZEVENT        Z_METADATA    Z_PRIMARYKEY  
可以看到有表格ZEVENT, 对应的CoreData.xcda*****odel文件有名字叫Event的Entity  
 
>.schema ZEVENT  
CREATE TABLE ZEVENT ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZTIMES*****P TIMES*****P );  
对应的Event中有属性timeS*****p, 可以看到, 相应的ZEVENT表格中有字段TIMES*****P  
 
> select * from ZEVENT  
1|1|1|306295807.974966  
2|1|1|306295810.981875  
3|1|1|306295811.982537  
这表格有三个记录, 可以用来初始化三个NSManagedObject, 修改了NSManagedObject, save之后也修改了表格记录  
 
你可以在CoreData.xcda*****odel添加新的entity, 之后用sqlit3命令来查看数据库的变化  
 
NSPersistentStoreCoordinator  
这个类的对象通常用NSManagedObjectModel的对象来初始化, 这个类抽象出不同的存放方式, 最经常用的是NSSQLiteStoreType.  
 
NSManagedObjectContext  
这个类的对象又用NSPersistentStoreCoordinator的对象来初始化, 它里面有些方法来添加, 删除NSManagedObject  
 
NSFetchRequest  
通常用NSEntityDescription来构造查询, 也就指定查询那个表格, 另外可以指定排序.  
 
CoreData的设计中, 下一层有相应的属性指向上一层, 所以NSManagedObject有属性得到NSEntityDescription, NSEntityDescription有属性得到NSManagedObjectModel.  
 
至于类  
NSFetchedResultsController, 只是又封了一下, 和NSFetchRequest合起来使用, 方便取数据, 另外和NSManagedObjectContext关联, 当数据库发生变化的时候收到通知.  
 
这文章只初步梳理了一下CoreData各类的关系, 各类的方法还需要一一研究. 文章最开始说CoreData是对sqlite数据库的一个封装, 不是严格的,CoreData不一定用sqlit来实现, 但他们之间确实有种对应关系。  


在 Core Data 应用中使用原生 SQL 功能 
苹果在iPhone 3.0以后的sdk中提供了Core Data功能,对于普通的数据库应用开发来说,大大提高了方便性。 
    新建Window Base Application的时候,选上下面的使用Core Data,模板就自动创建好了,在delegate文件里提供了使用Core Data存取数据的所有方法,在其它View Controller里面只要调用delegate里面的方法就可以了。而修改Data Model并基于该Model创建Entity定义也提供了可视化的操作,一旦定义了实例,只要在程序中new一个实例,给变量赋值,然后调用 delegate中的save方法就可以添加一条新的记录了。这种方法对于长文本和时间等sql中比较难处理的字段尤其好用。而且在已保存的记录中取列表等操作也非常方便。(具体可以参考apple提供的Core Data入门教程)。 
    但是后来当我需要做汇总功能的时候,就完全傻掉了,虽然Core Data也提供了简单的sum, avg等运算,但是对于ralati*****hip下的sum却完全找不到文档,甚至论坛上也搜不到解决方案。难道要我取出list再一个个手动汇总?这样数据量多的时候效率低的不是一点。当然,这时候如果能直接使用sql语句来汇总,那就最简单不过了。可是,Core Data封装的很完整,都不知道它把数据存到哪里去了,怎么办?难道要用sqlite重写整个程序,那已有添加和明细等功能就要做相当大的无谓的改动了。 
    今天终于找到了解决方案:Core Data本身就是基于sqlite的封装,所以它的底层仍然是使用sqlite进行存储数据的,而它使用的数据库,就在delegate文件中。通常是程序的Documents目录下的以程序名为名字的sqlite文件。如果程序已经在模拟器中运行过,只要进入用户目录下的 Library/Application Support/iPhone Simulator/User/Applicati*****/,这里是你所有模拟器中运行过的程序,找到你需要的那个,进去以后进入Documents目录,里面就是自动生成的sqlite数据库文件。把它复制出来,用sqlite3命令直接查看数据库结构就可以了。 
    默认情况下生成的数据表的名字就是你的Entity的名字,加上字母Z开头,字段名也就是你定义的实例名字,同样加上字母Z开头,而主键就是个自增长的int型。有了这个数据库结构,在程序中添加libsqlite3.0.dylib的framework,然后就可以在程序中使用原生 sqlite3功能了。 
    有了方便的core data解决简单的数据操作,再配合完全自定义的sqlite功能,现在可以随心所欲的开发强大的数据库应用了。 
 

转载自http://www.cocoachina.com/bbs/simple/?t44264.html 顺便膜拜一下写这篇文章的大牛。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值