本文大部分属于转载,只是提供一些编辑。但是看完这个内容以后,楼主这个小菜鸟理解了一下core data ,故和大家分享一下,一家之间,谨慎拍砖
CoreData框架的简单解释
并非严格的说,CoreData是对sqlite数据库的一个封装。
sqlite数据库操作的基本流程是,创建数据库,再通过定义一些字段来定义表格结构,可以利用sql语句向表格中插入记录,删除记录,修改记录,表格之间也可以建立联系。
这个过程出现了,表格的结构(schema),所有表格的结构和相互联系构成整个数据库的模型,255)">数据库存放的方式(可以是文件或者在内存),数据库操作,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命令来查看里面的表格结构
用命令行sqlite3CoreData.sqlite 进入
>.tables
ZEVENTZ_MetaDATAZ_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顺便膜拜一下写这篇文章的大牛。