12/08/2018, 12:32

Migrations với Core Data trong lập trình ứng dụng iOS

Là một lập trình viên iOS, nếu muốn thao tác với cở sở dữ liệu có lẽ chúng ta ngay lập tức sẽ nhớ tới Core Data. Đôi khi trong quá trình làm việc với ứng dụng sử dụng Core Data, bạn có thể sẽ muốn có những thay đổi trong data model của bạn. Tuy nhiên, nếu ứng dụng của bạn đã chạy, bạn có thể sẽ ...

Là một lập trình viên iOS, nếu muốn thao tác với cở sở dữ liệu có lẽ chúng ta ngay lập tức sẽ nhớ tới Core Data. Đôi khi trong quá trình làm việc với ứng dụng sử dụng Core Data, bạn có thể sẽ muốn có những thay đổi trong data model của bạn. Tuy nhiên, nếu ứng dụng của bạn đã chạy, bạn có thể sẽ không muốn phải làm gián đoạn quá trình sử dụng của người dùng.

Trong bài viết này, bằng một ví dụ đơn giản chúng ta sẽ thử tìm hiểu xem công việc migrating trong Core Data sẽ như thế nào nhé.

I. Khi nào thì Migrate?

Khi nào thì việc Migration là cần thiết ? Câu trả lời rất đơn giản : “Đó là khi bạn cần có sử thay đổi trong cấu trúc cơ sở dữ liệu.”

Tuy nhiên, có thể sẽ có những trường hợp mà bạn không nhất thiết phải thực hiện migration, chẳng hạn nếu bạn chỉ sử dụng Core Data để cache lại data offline, vậy nếu có thay đổi bạn chỉ cần đơn giản là xoá bỏ data store cũ đi và tạo mới là xong. Trong những trường hợp khác, bạn muốn đảm bảo dữ liệu của người dùng vẫn an toàn.

Let’s Migrate._

II. Quá trình Migrate

Để có thể bắt đầu quá trình này, Core Data cần biết cấu trúc dữ liệu gốc và cấu trúc dữ liệu đích đến. Core Data sẽ sử dụng hai phiên bản để load và tạo các “mapping model” cho việc migrate, .

Quá trình Migrate bao gồm ba bước Copy toàn bộ các đối tượng trong các store data. Kết nối tất cả các đối tượng tới mapping Tiến hành copy data và validation dữ liệu.

Vậy nếu quá trình migrate có lỗi thì dữ liệu nguyên gốc sẽ như thế nào ? Về cơ bản, sẽ không có chuyện gì xảy ra cho dữ liệu gốc trừ khi quá trình migate thành công mà không có lỗi.

III, Các loại Migrate

Lighweight migration : Khối lượng công việc tiến hành ít nhất, đơn giản nhất. Bạn chỉ cần kích hoạt một vào setting trong Core Data stck. Quá trình migrate sẽ tiến hành một cách tự động.

Manual migration : Bạn cần phải xác định rõ làm cách nào để map giữa data cũ với data mới. Sử dụng GUI tools và tự động.

Custom manual migration : Vẫn sử dụng Mapping model những thêm vào các dòng code để có thể custom quá trình mirgate của mình.

Fully manual migration :hard core nhé.

IV, Example

Đầu tiên, bạn có thể tải về project mẫu từ đây :

https://drive.google.com/file/d/0B9FOeas3cAbIMnl0S1N4eEpnYVE/view?usp=sharing

Khi chạy thử bạn sẽ thấy ứng dụng:

Screen Shot 2015-10-27 at 3.31.53 PM.png

Dưới đây là data model ta đã tạo sẵn :

Screen Shot 2015-10-27 at 3.33.15 PM.png

Tiếp theo, ta sẽ phát triển thêm một chức năng mới cho ứng dụng : Cho phép thêm ảnh vào ghi chú. Để làm việc điều này, ta cần thêm vào trường dữ liệu có khả năng lưu trữ photo, tuy nhiên, vì đã có các ghi chú được lưu lại, nên ta phải tiến hành migrating.

Đầu tiên, ta sẽ tạo ra một phiên bản mới của Data bằng cách mở : Editor Menu -> Add Model Version : MigateDemo 2

Screen Shot 2015-10-27 at 3.40.11 PM.png

Change Current Model Version sang : MigrateDemo 2

Screen Shot 2015-10-27 at 3.41.30 PM.png

Hãy chắc chắn rằng bạn sẽ có phiên bản v2 được lựa chọn và thêm vào Note Model thuộc tính “image” với loại của thuộc tính là “Transformable

Thuộc tính này sẽ lưu trữ dữ liệu binary của photo, bạn sẽ dử dụng NSValueTransformer để convert dữ liệu binary sang UIimage và ngược lại ( dùng trong quá tình lưu trữ ).

Đừng quên bổ sung thêm thuộc tính cho class Note.swift.

Giờ nếu bạn chạy thử Xcode console chắc chắn sẽ báo lỗi liên quan tới CoreDataStack object. Giờ ta sẽ tiến hành lighweight migration

Để tiến hành kích hoạt Migration, ta sẽ chỉnh sửa trong file CoreDataStack.swift.

Add thêm thuộc tính

var options: NSDictionary?

và hàm khởi tạo :

init(modelName: String, storeName: String,
 options: NSDictionary? = nil) {
  self.modelName = modelName
  self.storeName = storeName
  self.options = options
}

Thay đổi persistent store :

store = coordinator.addPersistentStoreWithType(
  NSSQLiteStoreType,
  configuration: nil,
  URL: storeURL,
  options: self.options)

Trong file NoteListVC, ta sẽ thay đổi hàm khởi tạo của CoreDataStack để có thể sử dụng migrate
lazy var stack : CoreDataStack = CoreDataStack(
  modelName:"MigateDemo2",
  storeName:"MigrateDemo",
  options:[NSMigratePersistentStoresAutomaticallyOption: true,
           NSInferMappingModelAutomaticallyOption: true])

NSMigratePersistentStoresAutomaticallyOption : Với options này, coredata sẽ tự động migration nếu data model không tương thích với data model hiện tại. NSInferMappingModelAutomaticallyOption : Tự động Mapping các model. Coredata có thể tự động tìm ra các điểm khác biệt và tạo ra các mapping data model giữa các phiên bản. Tuy nhiên có một vài qui tắc sau đây : Nếu có thay đổi , bạn bắt buộc phải tuân thủ theo : 1.Xoá entity, attribute hoặc relationship 2.Đổi tên 3.Thêm và các attribute mới hoặc các optional attribute. 4.Thêm vào các attribute mới hoặc require attribute với giá trị default 5.Thay đổi optional attribute thành non-optional attribute và thêm giá trị default 6.Thay đổi non-optional attribute thành optional 7.Thay đổi cấu trúc thực thể. 8.Thêm vào các thực thể cha hoặc thay đổi thứ tự trong cấu trúc thực thể 9.Thay đổi quan hệ từ 1 - 1 sang 1 - nhiều 10.Thay đổi quan hệ từ non-orderd - many sang order - money.

Quá trình mapping sẽ được tiến hành suôn sẻ nếu bạn có thay đổi trong Data model dựa trên các rule trên.

Chúc bạn may mắn mới việc migrating của mình. Lol

0