The Core Data Stack
Core Data bao gồm một số các đối tượng framework được tích hợp để cung cấp
các chức năng lưu trữ dữ liệu. Core Data Stack được minh họa như hình dưới đây:
Như chúng ta có thể thấy trong
hình trên, các ứng dụng iPhone nằm
trên đỉnh của ngăn
xếp và tương tác với các đối tượng dữ liệu
được xử lý
bởi managed
object context. Ý
nghĩa đặc biệt trong sơ đồ này là
một thực tế rằng mặc dù các cấp thấp hơn trong
ngăn xếp thực hiện một số lượng đáng kể các công việc liên quan trong việc cung cấp
chức năng Core Data, các code ứng dụng không tương tác trực
tiếp với chúng.
Trước khi chuyển sang làm việc một cách thực tế
hơn với Core Data, điều quan trọng là phải dành thời gian giải thích các yếu tố mà nó bao gồm trong stack Core Data với một chút chi tiết hơn.
Managed Objects
Managed objects là các đối tượng được tạo ra bởi code ứng dụng của bạn để lưu trữ dữ liệu. Một managed
object có thể được coi như như là một hàng hoặc một bản ghi trong một bảng cơ sở dữ liệu quan hệ. Đối với mỗi bản ghi mới
được thêm vào, một managed
object mới phải được tạo ra để lưu trữ các dữ liệu. Tương tự như vậy, dữ liệu được lấy sẽ được trả lại trong form của managed object, mỗi bản ghi nó gắn với tiêu chuẩn thu hồi được xác định. Các managed object thực sự là những
thể hiện của lớp NSManagedObject, hoặc một lớp con của chúng. Những
đối tượng này được chứa và
duy trì bởi bối managed
object context.
Managed Object Context
Core Data dựa
trên các ứng dụng không bao giờ tương tác trực tiếp với persistent
store. Thay vào đó,
các mã ứng dụng tương tác với các managed objects được
chứa trong lớp managed
object context của Core
Data stack. Context duy trì trạng thái của các đối tượng liên quan đến nơi chứa dữ liệu bên dưới và quản lý các mối quan hệ giữa
các managed object được xác định bởi mô hình managed
object. Tất cả các tương tác với
cơ sở dữ liệu bên dưới được tổ chức tạm thời trong context
cho đến khi context được chỉ dẫn để lưu các thay đổi, tại
điểm mà các thay đổi được truyền qua stack
Core Data và được viết vào the persistent store.
Managed Object Model
Cho đến nay chúng
tôi đã
tập trung vào việc quản lý các đối tượng dữ liệu nhưng chưa nhìn vào các mô hình dữ
liệu được định nghĩa như thế nào. Đây là nhiệm vụ của Managed
Object Model trong
đó xác định một khái niệm gọi là
các thực thể.
Một mô tả của lớp định nghĩa một kế hoạch chi tiết cho một thể hiện của đối tượng, các thực thể định nghĩa mô hình dữ liệu cho
các managed object. Về bản chất, một thực thể tương tự như các lược đồ định nghĩa một bảng trong một cơ sở dữ liệu quan hệ. Như vậy, mỗi thực thể có một tập
hợp các thuộc tính liên quan với
nó mà nó định nghĩa dữ liệu được lưu trữ
trong managed object có nguồn gốc từ (phát sinh từ) thực thể đó. Ví dụ, một thực thể Danh
bạ có thể chứa các thuộc tính như tên, địa chỉ và số
điện thoại.
Ngoài các thuộc tính,
các thực thể cũng có thể chứa các mối quan hệ, lấy (fetched) các thuộc tính và lấy các
yêu cầu:
• Relationships - Trong context của Core Data, relationships như những mối quan hệ trong các hệ thống cơ sở dữ liệu quan hệ khác trong đó chúng đề cập đến cách một đối tượng dữ liệu liên kết đến đối tượng dữ liệu khác. Core Data relationships có thể là quan hệ một-một, một-nhiều nhiều-nhiều.
• Fetched property – Cái này cung cấp một thay thế cho việc xác định các mối quan hệ. Fetched properties cho phép thuộc tính của một đối tượng dữ liệu được truy cập từ một đối tượng dữ liệu khác như một mối quan hệ đã được xác định giữa các thực thể. Fetched properties thiếu tính linh hoạt trong các mối quan hệ và được miêu tả trong các tài liệu của Apple Core dữ liệu là "yếu, các mối quan hệ một chiều” phù hợp nhất với" các mối quan hệ lỏng lẻo ".
• Fetch request - Một truy vấn được xác định trước có thể được tham chiếu để lấy các đối tượng dữ liệu dựa trên vị ngữ được xác định. Ví dụ, một fetch request có thể được cấu hình thành một thực thể để lấy tất cả các đối tượng liên lạc mà tên trường gắn với "John Smith".
Persistent Store Coordinator
Persistent Store Coordinator có trách nhiệm phối hợp truy cập vào các nơi chứa nhiều đối tượng liên tục (persistent). Như một nhà phát triển iPhone, bạn sẽ không bao giờ tương tác trực tiếp với điều phối viên của nơi chứa (store), trên thực tế, rất hiếm khi sẽ cần phải phát triển
một ứng dụng đòi hỏi
nhiều hơn một nơi chứa đối tượng liên tục. Khi nhiều nơi
chứa được yêu
cầu, điều phối viên “trưng
bày” các nơi chứa này lên các tầng trên của ngăn xếp Core Data như là một nơi chứa duy nhất.
Persistent Object Store
Persistent object store để chỉ các môi trường lưu trữ bên
dưới trong đó dữ liệu được lưu
trữ khi sử dụng Core Data. Core Data hỗ trợ ba
disk-based và một memory-based. Tùy chọn
trên Disk based bao gồm SQLite, XML và nhị phân. Theo mặc định, iPhone SDK sẽ sử dụng SQLite
như các Disk based store. Trong thực tế, các loại store đang được sử dụng là trong suốt đối với bạn như là nhà phát triển. Bất kể sự
lựa chọn của bạn về persistent
store, mã của bạn sẽ
làm cho các cuộc gọi đến cùng Core
Data APIs để quản lý
các đối
tượng dữ liệu theo yêu cầu của ứng dụng của
bạn.
Defining an Entity Description
Mô tả thực thể
có thể được xác
định từ trong môi trường Xcode. Khi một dự án
mới được tạo ra với các tùy chọn
để include Core Data, một tập tin mẫu sẽ được
tạo ra với tên <projectname>.xcdatamodel. Nhấp đôi vào tập tin này trong cửa sổ chính của dự án Xcode sẽ
được tải mô hình vào trong
môi trường edit thực thể, như được minh họa trong hình sau đây:
Tạo ra một thực
thể mới bằng cách nhấn vào nút
+ nằm ở nút bên trái của bảng điều khiển Entity (nằm ở góc trên bên
trái của cửa sổ). Các thực thể
mới sẽ xuất hiện trong danh sách và
bảng điều khiển chi tiết sẽ hiển thị các cài đặt
cho các thực thể mới. Diện tích đồ thị
cũng sẽ cập nhật để phản ánh sự tồn tại của thực thể mới mà ở
đó, nếu không có gì khác,
cái tên ít nhất phải được thay đổi
một cái gì
đó mô tả nhiều hơn so với mặc định (the name at
least should be changed to something more descriptive than the default):
Để thêm các thuộc
tính đến thực thể, hãy
nhấp vào nút + nằm
ở góc dưới bên trái của bảng điều khiển Property (nằm ở phía trên, trung tâm của cửa sổ) và chọn Add Attribute
từ menu kết quả. Trong bảng điều khiển
chi tiết, tên thuộc
tính và chỉ định kiểu và các lựa chọn khác được yêu cầu:
Lặp lại các bước trên để thêm nhiều hơn những thuộc tính và các thực thể.
Môi trường thực
thể Xcode cũng
cho phép các mối quan hệ được
thiết lập giữa các thực thể. Giả
sử, ví dụ, hai thực thể có tên là
Contacts và Sales. Để thiết lập một mối quan hệ giữa hai bảng, click chuột phải vào hộp Contacts trong khu vực đồ thị và chọn Add
Relationship từ menu. Trong tên bảng chi tiết tên các mối quan hệ, xác định target cho thực thể Sales và bất kỳ tùy chọn khác được yêu cầu cho mối
quan hệ. Các biểu đồ sẽ cập nhật
để phản ánh mối quan hệ:
Như đã chứng minh, Xcode làm cho quá trình
mô tả thực thể
khá đơn giản. Trong khi một tổng quan chi tiết
của quá trình này là vượt quá phạm vi của cuốn sách này, có nhiều nguồn tài liệu
khác có sẵn được dành riêng cho các chủ đề.
Obtaining the Managed Object Context
Kể từ khi nhiều phương thức Core Data yêu cầu managed object context như một tham số, bước tiếp theo sau khi
xác định mô tả thực
thể thường liên quan đến việc chứa một tham chiếu đến context. Điều này đạt được bằng cách
xác định application delegate và sau đó gọi phương thức managedContextObject
của đối tượng delegate:
coreDataAppDelegate *appDelegate = [[UIApplication sharedApplication]
delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
Getting an Entity Description
Trước khi managed objects có thể được tạo ra và thao tác trong mã,
mô tả thực thể
tương ứng đầu
tiên phải được nạp. Điều này đạt
được bằng cách gọi phương thức entityForName của lớp NSEntityDescription, truyền thông qua tên của
thực thể được yêu cầu và context như là các đối số và sau đó tạo ra một fetch
request. Các đoạn mã
sau đây chứa
mô tả cho một thực thể với tên Contacts:
NSEntityDescription *entityDesc = [NSEntityDescription
entityForName:@"Contacts" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDesc];
Creating a Managed Object
Having obtained the managed context, một managed object mới phù hợp với một mô tả thực thể được xác định có thể được tạo ra bằng cách tham chiều đến context và mô tả tên thực thể:
NSManagedObject *newContact;
newContact = [NSEntityDescription insertNewObjectForEntityForName:@"Contacts"
inManagedObjectContext:context];
NSError *error;
[context save:&error];
Getting and Setting the Attributes of a Managed Object
Như thảo luận
trước đó, các thực thể và các managed object mà từ đó chúng được bắt đầu chứa dữ liệu trong các form của các thuộc tính. Những
thuộc tính này được lưu trữ trong
các đối tượng bằng cách sử dụng một value-key để mã hóa hệ thống, theo đó key này được tham chiếu để lấy hoặc thiết lập các thuộc tính tương ứng. Giả
sử một managed
object tên newContact với những thuộc tính chỉ định
các khóa tên, địa chỉ và số điện thoại tương ứng, các giá trị của các thuộc tính này
có thể được thiết
lập bằng cách sử dụng phương thức setValue của thể hiện của lớp NSManagedObject:
[newContact setValue:@”John Smith” forKey:@"name"];
[newContact setValue:@”123 The Street” forKey:@"address"];
[newContact setValue:@”555-123-1234” forKey:@"phone"];
Ngược lại, giá
trị hiện tại cho một khóa tương ứng có thể được truy cập bằng cách sử dụng phương pháp valueForKey của managed object:
NSString *contactname = [newcontact valueForKey:@”name”];
Dòng code trên trích giá trị hiện tại cho các thuộc tính tên của managed object newcontact quản lý đối
tượng và gán nó vào một đối tượng chuỗi.
Fetching Managed Objects
Một khi managed object được lưu vào persistent
object store thì nó rất có khả năng là các đối tượng đó và dữ liệu chúng
chứa sẽ cần phải được lấy.
Các đối tượng
được lấy
ra bằng cách thực hiện một
fetch request và được trả về trong form của một đối tượng NSArray.
Các mã sau đây giả định rằng cả hai context và mô tả thực thể đã thu được trước khi
thực hiện fetch request:
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDesc];
NSError *error;
NSArray *matching_objects = [context executeFetchRequest:request error:&error];
[request release];
Sau khi thực hiện, các mảng matching_objects
sẽ chứa tất cả
các managed object được lấy theo yêu cầu.
Retrieving Managed Objects based on Criteria
Ví dụ trước lấy
ra tất cả các đối tượng được quản lý từ các persistent
object store cho một
thực thể được chỉ định. More
often than not only managed objects that match specified criteria are required
during a retrieval operation. Điều này được thực hiện
bằng cách định nghĩa một vị ngữ mà nó xác định chuẩn mà managed object phải được đáp ứng để có đủ
điều kiện để lấy. Ví dụ, mã sau đây thực
hiện một vị ngữ để
chỉ trích xuất các đối tượng quản lý mà ở đó các thuộc tính tên gắn với "John Smith":
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDesc];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"(name = %@)", “John Smith”];
[request setPredicate:pred];
NSError *error;
NSArray *matching_objects = [context executeFetchRequest:request error:&error];
[request release];
Summary
Core Data framework stack cung cấp một thay thế linh hoạt để trực tiếp quản lý dữ liệu
bằng cách sử
dụng SQLite hoặc
các cơ chế lưu trữ dữ liệu khác. Bằng cách cung cấp một lớp đối tượng trừu tượng được được định hướng trên các dữ liệu của việc quản lý lưu trữ dữ liệu được thực hiện dễ dàng hơn cho các nhà phát triển ứng dụng iPhone.
No comments:
Post a Comment