首先,coredata和sqlite的概念不同,core為對象周期管理,而sqlite為DBMS。
/////////////////////
數據庫管理系統(Database Management System)是一種操縱和管理數據庫的大型軟件,用於建立、使用和維護數據庫,簡稱..DBMS。它對數據庫進行統一的管理和控制,以保證數據庫的安全性和完整性。用戶通過DBMS來訪問數據庫中的數據,數據管理員通過DBMS進行數據庫的維護工作。它可使多個應用程序和用戶用不同的方法在同時或不同時刻去建立,修改和詢問數據庫。大部分DBMS提供數據自定義語言DDL(Data Definition Language)和數據操作語言(Data Manipulation Language),供用戶定義數據庫的模式結構與權限約束,實現對數據的追加、刪除等操作。
///////////////////
下面的討論以使用core data來做數據持久化並使用sqlite做backend存儲的情況為前提。
- 使用方便性。實際上,一個成熟的工程中一定是對數據持久化進行了封裝的,因此底層使用的到底是core data還是sqlite,不應該被業務邏輯開發者關心。因此,即使習慣寫SQL查詢的人,也應該避免在業務邏輯中直接編寫SQL語句。
- 存 儲性能,在寫入性能上,因為都是使用的sqlite格式作為磁盤存儲格式,因此其性能是一樣的,如果你覺得用core data寫的慢,很可能是你用sqlite的時候寫的每條數據的內容沒有core data時多,或者是你批量寫入的時候每寫入一條就調用了一次save。
- 查 詢性能,core data因為要兼容多種后端格式,因此查詢時,其可用的語句比直接使用sqlite少,因此有些fetch實際上不是在sqlite中執行的。但這樣未必 會降低查詢效率。因為iPhone的flash memory速度還是很快的。我的經驗是大部分時候,在內存不是很緊張時,直接fetch一個entity的所有數據然后在內存中做filter往往比使 用predicate在fetch時過濾更快。如果你覺的查詢慢,很可能是查詢方式有問題,可以把core data的debug模式打開,看一下到底執行了多少SQL語句,相信其中大部分是可以通過改寫core data的調用方式避免的。
- core data的一個比較大的痛點是多人合作開發的時候,管理coredata的模型需要很小心,尤其是合並的時候,他的data model是XML格式的,手動resolve比較煩心。
- core data還有其他sql所不具備的優點,比如對undo的支持,多個context實現sketchbook類似的功能。為ManagedObject優化的row cash等。
- 另外core data是支持多線程的,但需要thread confinement的方式實現,使用了多線程之后可以最大化的防止阻塞主線程。