您的位置:首页 > 数据库

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

2012-08-13 22:25 246 查看
 本文大部分属于转载,只是提供一些编辑。但是看完这个内容以后,楼主这个小菜鸟理解了一下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开头,字段名也就是你定义
9604
的实例名字,同样加上字母Z开头,而主键就是个自增长的int型。有了这个数据库结构,在程序中添加libsqlite3.0.dylib的framework,然后就可以在程序中使用原生 sqlite3功能了。 
    有了方便的core data解决简单的数据操作,再配合完全自定义的sqlite功能,现在可以随心所欲的开发强大的数据库应用了。 
 

转载自http://www.cocoachina.com/bbs/simple/?t44264.html 顺便膜拜一下写这篇文章的大牛。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息