你的位置:首页 > 操作系统

[操作系统]SQLite和CoreData数据库的比较


1. SQLite数据库

  • sqlite数据库操作的基本流程是, 创建数据库, 再通过定义一些字段来定义表格结构, 可以利用sql语句向表格中插入记录, 删除记录, 修改记录, 表格之间也可以建立联系。

  • 这些操作都需要使用SQL语句去实现,感觉操作很直接。如果先前有一点数据库和SQL基础的话,写起来会感觉很亲切,都是一些数据库操作的语句。但是当操作变多之后,语句越来越多,就很烦,代码比较多,看起来也会混乱一些。

  • 如果想要详细了解,可以看iOS学习36数据处理之SQLite数据库

2. CoreData数据库

  • CoreData.framework :iOS中提供了对原始SQLite数据库API访问的封装,通过这个framework来管理数据缓存和持久数据要比使用SQL语句操作SQLite数据库简单和方便许多。

  • 机制:通过framework来存储和查询数据只需要使用framework提供的类就可以,你可以完全使用对象的形式来管理你的数据以及数据之间的关系,framework已经很好地将数据库表和字段封装成了对象和属性,表之间的一对多、多对多关系则封装成了对象之间的包含关系.

  • 通过 relationship 来表示:

  一对多时:设置为 properties 项选中 Optional, Plural 选项 To-Many Relationship 选中;

  多对一反向关系时:properties 项选中 Optional, Count 项选中Minimun 和 Maximun 并分别设置其值为1;

  如果想要详细了解,可以看iOS学习37数据处理之CoreData

3. 比较

 1> CoreData的类与SQLite数据库中的文字描述做一个对应:

  NSEntityDescription --> 表格结构
  NSManagedObjectModel --> 数据库中所有表格和他们的联系
  NSPersistentStoreCoordinator --> 数据库存放方式
  NSManagedObjectContext --> 数据库操作
  NSFetchRequest --> 查询语句
  NSManagedObject --> 表格的记录

 2> 下面我们可以详细的看看CoreData的类 

  • NSEntityDescription、NSManagedObjectModel

   NSEntityDescription 用来定义表格结构, 所以你就可以理解 NSManagedObjectModel 中的 setEntities:(NSArray *)entities 函数大概有什么用了 . 通常, 定义 model , 是用文件 CoreData.xcda*****odel , 可以图形化的操作. 这类似用nib来创建界面.

  • NSPersistentStoreCoordinator

   这个类的对象通常用 NSManagedObjectModel 的对象来初始化, 这个类抽象出不同的存放方式, 最经常用的是 NSSQLiteStoreType.

  • NSManagedObjectContext

   这个类的对象又用 NSPersistentStoreCoordinator 的对象来初始化, 它里面有些方法来添加, 删除 NSManagedObject

  • NSFetchRequest

   通常用 NSEntityDescription 来构造查询, 也就指定查询那个表格, 另外可以指定排序.

  •  NSFetchedResultsController

  NSFetchedResultsController 只是又封了一下, 和 NSFetchRequest 合起来使用, 方便取数据, 另外和 NSManagedObjectContext 关联, 当数据库发生变化的时候收到通知.

 3> 特点比较

  • CoreData的强大之处就在于这种关系可以在一个对象更新时,其关联的对象也会随着更新,相当于你更新一张表的时候,其关联的其他表也会随着更新。

  • Core Data的另外一个特点就是提供了更简单的性能管理机制,例如,使用NSFetchedResultsController类,你不用使用SQL的Limit而是使用NSFetchRequest类的setFetchBatchSize()就可以限制查询记录的总数,而NSFetchedResultsController类神奇的地方在于需要获取更多记录的时候,这个类会自动更新其缓存。

  • 对于多表查询上相对来说,CoreData 没有 SQL 直观,但 CoreData 的功能还是可以完成相关操作的,但是对于类似外连接,左连接等操作,在CoreData中就显得无力。