Advertisement
  1. Code
  2. Core Data

Core Data và Swift: Core Data Stack

Scroll to top
Read Time: 17 min
This post is part of a series called Core Data and Swift.
Core Data and Swift: Data Model

Vietnamese (Tiếng Việt) translation by Thai An (you can also view the original English article)

Lời nói đầu

Framework Core Data đã tồn tại nhiều năm. Nó được sử dụng trong hàng ngàn các ứng dụng và bởi hàng triệu người, cả trên iOS và OS X. Core Data được duy trì bởi Apple và được viết tài liệu rất tốt. Nó là một framework hoàn thiện đã ngày càng chứng minh được giát trị.

Mặc dù Core Data dựa chủ yếu vào Objective-C runtime và tích hợp chặt chẽ với Core Foundation framework, bạn có thể dễ dàng sử dụng framework này trong các project Swift. Kết quả là một framework dễ sử dụng dành cho việc quản lý một object graph cái mà dễ dùng và cực kỳ hiệu quả đó là thanh lịch để sử dụng và vô cùng hiệu quả trong việc sử dụng bộ nhớ.

1. Điều kiện tiên quyết

Cái framework Core Data về bản chất thì không khó, nhưng nếu bạn là người mới đối với việc phát triển iOS hoặc OS X, thì tôi đề nghị bạn đầu tiên đi qua series của chúng tôi về việc phát triển iOS. Nó dạy bạn những nguyên tắc cơ bản của việc phát triển iOS và, khi hết series, bạn sẽ có đủ kiến thức để vào các chủ đề phức tạp hơn, chẳng hạn như Core Data.

Như tôi đã nói, Core Data không phức tạp hay khó để tiếp cận như nhiều developer nghĩ. Tuy nhiên, tôi đã học được rằng một nền tảng vững chắc là rất quan trọng để có được tiếp cận nhanh chóng với Core Data. Bạn cần có một hiểu biết đúng đắn về API Core Data để tránh những thực hành xấu và chắc chắn rằng bạn không mắc phải các vấn đề về việc sử dụng framework.

Mọi thành phần của framework Core Data đều có một mục đích và chức năng cụ thể. Nếu bạn cố dùng Core Data theo một cách mà nó không được thiết kế như vậy, thì chắc chắn sẽ dẫn đến việc bạn phải vật lộn với cái framework.

Những gì tôi đề cập đến trong loạt bài này thì có thể áp dụng cho iOS 7+ (từ iOS 7 trở lên) và OS X 10.10+ (từ OS X 10.10 trở lên), nhưng sẽ tập trung trên iOS. Trong loạt bài này, tôi sẽ làm việc với Xcode 7.1 và Swift 2.1. Nếu bạn thích Objective-C hơn, thế thì tôi đề nghị bạn đọc loạt bài trước của tôi về framework Core Data.

2. Đường cong học tập

Framework core data có vẻ khó khăn lúc đầu, nhưng API trực quan và súc tích khi bạn hiểu cách các phần khác nhau của câu đố khớp với nhau. Và đó chính xác là lý do tại sao hầu hết các nhà phát triển đều gặp phải vấn đề khi sử dụng framework công tác. Họ cố gắng sử dụng Core Data trước khi họ đã nhìn thấy câu đố ngôn ngữ đó, họ không biết các phần của câu đố phù hợp với nhau như thế nào và liên quan đến nhau.

Trong bài viết này, tôi sẽ giúp bạn làm quen với ngăn xếp Core Data. Một khi bạn hiểu được những người chơi chính của ngăn xếp Core Data, framework công tác sẽ cảm thấy ít khó khăn hơn và thậm chí bạn sẽ bắt đầu tận hưởng và đánh giá cao API được chế tác tốt của framework công tác.

Trái ngược với các framework công tác như UIKit, mà bạn có thể sử dụng mà không hiểu toàn bộ framework công tác, Core Data đòi hỏi sự hiểu biết đúng đắn về các khối xây dựng của nó. Điều quan trọng là dành một chút thời gian để làm quen với framework công tác mà chúng tôi sẽ làm trong hướng dẫn này.

3. Core Data là gì?

Các nhà phát triển mới vào framework Core Data thường nhầm lẫn và mong đợi nó hoạt động như một cơ sở dữ liệu. Nếu có một điều tôi hy vọng bạn sẽ nhớ từ loạt bài này, đó là Core Data không phải là một cơ sở dữ liệu và bạn không nên mong đợi nó hoạt động như một.

Core Data là gì nếu nó không phải là một cơ sở dữ liệu? Core Data là lớp mô hình của ứng dụng của bạn theo nghĩa rộng nhất có thể. Đó là Model trong mẫu Model-View-Controller thấm vào iOS SDK.

Core Data không phải là cơ sở dữ liệu của ứng dụng của bạn cũng không phải là một API để lưu trữ dữ liệu vào cơ sở dữ liệu. Core Data là một framework quản lý biểu đồ đối tượng. Nó đơn giản như vậy. Core Data có thể duy trì biểu đồ đối tượng đó bằng cách ghi nó vào đĩa, nhưng đó không phải là mục tiêu chính của framework công tác.

4. Core Data Stack

Như tôi đã đề cập trước đó, ngăn xếp Core Data là trung tâm của Core Data. Đó là một bộ sưu tập các đối tượng làm cho Core Data được đánh dấu. Các đối tượng chính của ngăn xếp là mô hình đối tượng được quản lý, điều phối viên lưu trữ liên tục và một hoặc nhiều bối cảnh đối tượng được quản lý. Hãy bắt đầu bằng cách xem nhanh từng thành phần.

NSManagedObjectModel

Mô hình đối tượng được quản lý đại diện cho mô hình dữ liệu của ứng dụng. Mặc dù Core Data không phải là cơ sở dữ liệu, bạn có thể so sánh mô hình đối tượng được quản lý với giản đồ của cơ sở dữ liệu, có chứa thông tin về các mô hình hoặc thực thể của biểu đồ đối tượng, thuộc tính của chúng và cách chúng liên quan đến nhau.

Đối tượng NSManagedObjectModel biết về mô hình dữ liệu bằng cách tải một hoặc nhiều tệp mô hình dữ liệu trong quá trình khởi tạo của nó. Chúng ta sẽ xem xét cách thức hoạt động này trong một vài phút.

NSPersistentStoreCoordinator

Như tên gọi của nó, đối tượng NSPersistentStoreCoordinator tiếp tục lưu trữ dữ liệu vào đĩa và đảm bảo (các) lưu trữ liên tục và mô hình dữ liệu tương thích. Nó trung gian giữa các cửa hàng liên tục (s) và bối cảnh đối tượng quản lý (s) và cũng chăm sóc tải và bộ nhớ đệm dữ liệu. Đúng rồi. Dữ liệu chính có bộ nhớ đệm được tích hợp sẵn.

Điều phối viên lưu trữ lâu dài là người chỉ huy dàn nhạc Core Data. Mặc dù có vai trò quan trọng trong ngăn xếp Core Data, bạn hiếm khi tương tác trực tiếp với nó.

NSManagedObjectContext

Đối tượng NSManagedObjectContext quản lý một tập hợp các đối tượng mô hình, các cá thể của lớp NSManagedObject. Có thể ứng dụng có nhiều bối cảnh đối tượng được quản lý. Mỗi bối cảnh đối tượng được quản lý được hỗ trợ bởi một điều phối viên lưu trữ liên tục.

Bạn có thể thấy một bối cảnh đối tượng được quản lý như một bàn làm việc mà bạn làm việc với các đối tượng mô hình của mình. Bạn tải chúng, bạn thao tác chúng và lưu chúng trên bàn làm việc đó. Tải và lưu được trung gian bởi các điều phối viên lưu trữ liên tục. Bạn có thể có nhiều bàn làm việc, rất hữu ích nếu ứng dụng của bạn đa luồng, ví dụ.

Trong khi một mô hình đối tượng được quản lý và điều phối viên lưu trữ liên tục có thể được chia sẻ qua các luồng, thì các bối cảnh đối tượng được quản lý sẽ không bao giờ được truy cập từ một luồng khác với luồng mà chúng được tạo ra. Chúng ta sẽ thảo luận về đa luồng chi tiết hơn sau trong loạt bài này.

5. Khám phá ngăn xếp core data

Bước 1: Thiết lập dự án

Hãy tìm hiểu về ngăn xếp Core Data chi tiết hơn bằng cách xem ví dụ. Tạo một dự án mới trong Xcode 7 bằng cách chọn New> Project ... từ trình đơn File. Chọn mẫu Ứng dụng xem đơn từ danh sách iOS> Mẫu ứng dụng ở bên trái.

Project SetupProject SetupProject Setup

Đặt tên cho dự án Core Data, thiết lập Language thành Swift, Devices thành iPhone và đánh dấu vào hộp kiểm có nhãn Use Core Data. Cho Xcode biết nơi bạn muốn lưu trữ các tệp dự án và nhấp vào Tạo.

Project ConfigurationProject ConfigurationProject Configuration

Bước 2: Tổng quan

Theo mặc định, Apple đặt mã liên quan đến Core Data trong lớp đại biểu của ứng dụng, lớp AppDelegate trong ví dụ của chúng ta. Mở AppDelegate.swift và bắt đầu khám phá việc triển khai lớp AppDelegate.

Ở phía trên cùng của AppDelegate.swift, bạn sẽ thấy một câu lệnh nhập khẩu cho framework Core Data.

1
import UIKit
2
import CoreData

Lớp AppDelegate tiếp tục chứa bốn thuộc tính được lưu trữ lười biếng:

  • applicationDocumentsDirectory loại NSURL
  • managedObjectModel loại NSManagedObjectModel
  • managedObjectTiếp theo loại NSManagedObjectContext
  • persistentStoreCoordinator của loại NSPersistentStoreCoordinator

Thuộc tính đầu tiên, applicationDocumentsDirectory, không gì khác ngoài một trình trợ giúp để truy cập thư mục Documents của ứng dụng. Việc triển khai khá đơn giản như bạn có thể thấy bên dưới. Lớp NSFileManager được sử dụng để lấy vị trí của thư mục Documents của ứng dụng.

1
lazy var applicationDocumentsDirectory: NSURL = {
2
    let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
3
    return urls[urls.count-1]
4
}()

Ba thuộc tính còn lại được lưu trữ lười biếng thú vị hơn và liên quan trực tiếp đến framework Core Data. Đầu tiên chúng ta sẽ khám phá thuộc tính managedObjectContext.

Bước 3: Ngữ cảnh đối tượng được quản lý

Lớp bạn sẽ sử dụng thường xuyên nhất, ngoài NSManagedObject, khi tương tác với Core Data là NSManagedObjectContext.

1
lazy var managedObjectContext: NSManagedObjectContext = {
2
    let coordinator = self.persistentStoreCoordinator
3
    var managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
4
    managedObjectContext.persistentStoreCoordinator = coordinator
5
    return managedObjectContext
6
}()

Lưu ý rằng đối tượng NSManagedObjectContext được khởi tạo và cấu hình trong một đóng. Trong đóng cửa, đầu tiên chúng tôi có được một tham chiếu đến các điều phối viên lưu trữ liên tục. Sau đó, chúng ta khởi tạo NSManagedObjectContext, truyền vào .MainQueueConcurrencyType làm đối số đầu tiên. Bạn sẽ tìm hiểu thêm về các loại tương tranh trong phần sau của loạt bài này. Bằng cách đi vào .MainQueueConcurrencyType, chúng tôi chỉ ra rằng bối cảnh đối tượng được quản lý sẽ thực hiện công việc của mình bằng cách sử dụng hàng đợi của chuỗi chính.

Trước khi chúng ta trả về bối cảnh đối tượng được quản lý, chúng ta thiết lập thuộc tính persistentStoreCoordinator của đối tượng. Nếu không có một điều phối viên lưu trữ liên tục, bối cảnh đối tượng được quản lý là vô ích. Điều đó không quá khó. Là nó?

Tóm lại, bối cảnh đối tượng được quản lý quản lý một tập hợp các đối tượng mô hình, các cá thể của lớp NSManagedObject và giữ một tham chiếu tới một điều phối viên lưu trữ liên tục. Hãy ghi nhớ điều này trong khi đọc phần còn lại của bài viết này.

Bước 4: Điều phối viên cửa hàng liên tục

Như chúng ta đã thấy một lúc trước, thuộc tính persistentStoreCoordinator được truy cập trong khi cấu hình ngữ cảnh đối tượng được quản lý. Hãy xem xét việc thực hiện thuộc tính persistentStoreCoordinator, nhưng đừng để nó làm bạn sợ. Nó thực sự không phức tạp.

1
lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
2
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
3
    let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("SingleViewCoreData.sqlite")
4
    var failureReason = "There was an error creating or loading the application's saved data."
5
    do {
6
        try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil)
7
    } catch {
8
        var dict = [String: AnyObject]()
9
        dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data"
10
        dict[NSLocalizedFailureReasonErrorKey] = failureReason
11
12
        dict[NSUnderlyingErrorKey] = error as NSError
13
        let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
14
        NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
15
        abort()
16
    }
17
    
18
    return coordinator
19
}()

Bạn sẽ hầu như luôn muốn lưu trữ đồ thị đối tượng của Core Data vào đĩa và việc triển khai thực hiện thuộc tính persistentStoreCoordinator của Apple sử dụng cơ sở dữ liệu SQLite để thực hiện điều này. Đây là một kịch bản phổ biến cho các ứng dụng Core Data.

Trong việc đóng thuộc tính persistentStoreCoordinator, chúng ta bắt đầu bằng cách khởi tạo một cá thể của lớp NSPersistentStoreCoordinator, truyền vào mô hình đối tượng được quản lý như một đối số. Chúng ta sẽ khám phá thuộc tính managedObjectModel trong giây lát.

Như bạn có thể thấy, việc tạo một đối tượng NSPersistentStoreCoordinator rất dễ dàng. Tuy nhiên, một điều phối viên lưu trữ lâu dài là ít sử dụng nếu nó không có bất kỳ cửa hàng liên tục để quản lý. Trong phần còn lại của việc đóng cửa, chúng tôi cố gắng tải một cửa hàng liên tục và thêm nó vào điều phối viên lưu trữ liên tục.

Chúng ta bắt đầu bằng cách xác định vị trí của cửa hàng trên đĩa, sử dụng thuộc tính applicationDocumentsDirectory mà chúng ta đã thấy trước đó. Kết quả, một đối tượng NSURL, được chuyển tới phương thức addPersistentStoreWithType (_: configuration: URL: options :) của lớp NSPersistentStoreCoordinator. Như tên của phương thức chỉ ra, phương thức này thêm một cửa hàng liên tục vào điều phối viên lưu trữ liên tục. Phương thức này chấp nhận bốn đối số.

Đầu tiên chúng ta chỉ định kiểu lưu trữ, NSSQLiteStoreType trong ví dụ này. Core Data cũng hỗ trợ các cửa hàng nhị phân (NSBinaryStoreType) và một kho lưu trữ trong bộ nhớ (NSInMemoryStoreType).

Đối số thứ hai cho Core Data biết cấu hình nào sẽ sử dụng cho kho lưu trữ liên tục. Chúng tôi chuyển vào nil, thông báo cho Core Data sử dụng cấu hình mặc định. Đối số thứ ba là vị trí của cửa hàng, được lưu trữ trong url.

Đối số thứ tư là một từ điển các tùy chọn cho phép chúng ta thay đổi hành vi của cửa hàng liên tục. Chúng tôi sẽ xem xét lại khía cạnh này sau trong loạt bài này và chuyển vào nil ngay bây giờ.

Bởi vì addPersistentStoreWithType (_: configuration: URL: options :) là một phương thức ném, chúng ta gọi phương thức trong một câu lệnh do-catch. Nếu không có lỗi nào xuất hiện, phương thức này trả về một đối tượng NSPersistentStore. Chúng tôi không giữ một tham chiếu đến các cửa hàng liên tục, bởi vì chúng tôi không cần phải tương tác với nó một khi nó được thêm vào điều phối viên lưu trữ liên tục.

Tuy nhiên, nếu việc thêm cửa hàng liên tục không thành công, điều đó có nghĩa là có sự cố với việc lưu trữ ứng dụng liên tục và chúng tôi cần thực hiện các bước cần thiết để giải quyết sự cố. Khi điều này xảy ra và tại sao nó xảy ra là chủ đề của một phần trong tương lai của loạt bài này.

Trong điều khoản bắt, chúng tôi đăng nhập bất kỳ lỗi nào vào bảng điều khiển và hủy bỏ được gọi. Bạn không bao giờ nên gọi hủy bỏ trong một môi trường sản xuất, bởi vì nó treo ứng dụng. Chúng tôi sẽ thực hiện một giải pháp ít tích cực hơn trong loạt bài này.

Bước 5: Mô hình đối tượng được quản lý

Phần thứ ba và cuối cùng của câu đố là mô hình đối tượng được quản lý. Chúng ta hãy xem xét việc thực hiện thuộc tính managedObjectModel.

1
lazy var managedObjectModel: NSManagedObjectModel = {
2
    let modelURL = NSBundle.mainBundle().URLForResource("Core_Data", withExtension: "momd")!
3
    return NSManagedObjectModel(contentsOfURL: modelURL)!
4
}()

Việc thực hiện rất dễ dàng. Chúng tôi lưu trữ vị trí của mô hình của ứng dụng trong modelURL và sử dụng nó trong quá trình tạo mô hình đối tượng được quản lý.

Bởi vì initializer, init (contentsOfURL :), trả về một tùy chọn, chúng ta buộc unwrap nó trước khi trả về kết quả. Điều đó không nguy hiểm sao? Có và không. Nó không được khuyến khích để buộc các tùy chọn unwrap. Tuy nhiên, việc không khởi tạo mô hình đối tượng được quản lý có nghĩa là ứng dụng không thể tìm thấy mô hình dữ liệu trong gói của ứng dụng. Nếu điều đó xảy ra, thì có điều gì đó đã xảy ra ngoài tầm kiểm soát của ứng dụng.

Tại thời điểm này, bạn có thể tự hỏi mô hình đó là gì modelURL đang trỏ đến và tệp có phần mở rộng .momd là gì. Để trả lời những câu hỏi này, chúng ta cần phải tìm hiểu Xcode khác đã tạo ra cho chúng ta trong quá trình thiết lập của dự án.

Trong Project Navigator ở bên trái, bạn sẽ thấy một tệp có tên Core_Data.xcdatamodeld. Đây là mô hình dữ liệu của ứng dụng được biên dịch thành tệp .momd. Đó là tệp .momd mà mô hình đối tượng được quản lý sử dụng để tạo mô hình dữ liệu của ứng dụng.

Core Data ModelCore Data ModelCore Data Model

Có thể có một số tệp mô hình dữ liệu. Lớp NSManagedObjectModel hoàn toàn có khả năng kết hợp nhiều mô hình dữ liệu thành một, đó là một trong những tính năng mạnh mẽ và nâng cao của Core Data.

Framework core data cũng hỗ trợ phiên bản mô hình dữ liệu cũng như di chuyển. Điều này đảm bảo rằng dữ liệu được lưu trữ trong kho lưu trữ liên tục (s) không bị hỏng. Chúng tôi sẽ giới thiệu phiên bản và di chuyển sau trong loạt bài này.

Tệp mô hình dữ liệu trong dự án của bạn trống vào lúc này, có nghĩa là mô hình dữ liệu của bạn không chứa các thực thể. Chúng tôi sẽ khắc phục điều này trong hướng dẫn tiếp theo sẽ tập trung hoàn toàn vào mô hình dữ liệu.

6. Đưa tất cả cùng nhau

Trước khi chúng ta kết thúc bài viết này, tôi muốn cho bạn thấy một sơ đồ minh họa ba thành phần của ngăn xếp Core Data.

Core Data StackCore Data StackCore Data Stack

Sơ đồ trên là một biểu diễn trực quan về những gì chúng ta đã khám phá trong dự án ví dụ một thời điểm trước đây. Đối tượng NSPersistentStoreCoordinator là bộ não của ngăn xếp Core Data của ứng dụng. Nó nói chuyện với một hoặc nhiều cửa hàng liên tục và đảm bảo dữ liệu được lưu, tải và lưu trữ.

Điều phối viên lưu trữ liên tục biết về mô hình dữ liệu, lược đồ của đồ thị đối tượng nếu bạn thích, thông qua đối tượng NSManagedObjectModel. Mô hình đối tượng được quản lý tạo mô hình dữ liệu của ứng dụng từ một hoặc nhiều tệp .momd, biểu diễn nhị phân của mô hình dữ liệu.

Cuối cùng nhưng không kém phần quan trọng, ứng dụng truy cập biểu đồ đối tượng thông qua một hoặc nhiều phiên bản của lớp NSManagedObjectContext. Ngữ cảnh đối tượng được quản lý biết về mô hình dữ liệu thông qua điều phối viên lưu trữ liên tục, nhưng nó không biết hoặc giữ tham chiếu đến mô hình đối tượng được quản lý. Không cần một tham chiếu như vậy.

Ngữ cảnh đối tượng được quản lý yêu cầu người điều phối liên tục cho dữ liệu và yêu cầu nó lưu dữ liệu khi cần thiết. Điều này là tất cả được thực hiện cho bạn bởi framework core data và ứng dụng của bạn hiếm khi cần nói chuyện với người điều phối cửa hàng liên tục trực tiếp.

Tổng kết

Trong bài viết này, chúng tôi đã đề cập đến các trình phát chính của ngăn xếp Core Data, điều phối viên lưu trữ liên tục, mô hình đối tượng được quản lý và bối cảnh đối tượng được quản lý. Hãy chắc chắn rằng bạn hiểu vai trò của từng thành phần và, quan trọng hơn, cách chúng hoạt động cùng nhau để làm cho Core Data thực hiện phép thuật của nó.

Trong phần tiếp theo của loạt bài này, chúng ta đi sâu vào data model. Chúng ta hãy xem xét trình soạn thảo mô hình dữ liệu trong Xcode và chúng ta tạo một vài thực thể, các thuộc tính và các mối quan hệ.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.