天天看點

【原】iOS學習之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中就顯得無力。