Thursday, September 6, 2012

Làm việc với cơ sở dữ liệu trong iphone bằng cách sử dụng Core Data


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:


Core Data Stack Architecture diagram



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 tương tác với các đối tượng dữ liệu được xử bởi managed object context. Ý nghĩa đặc biệt trong sơ đồ này là một thực tế rằng mặc 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 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ư 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ự 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 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 quản 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 đượ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ể 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 nguồn gốc từ (phát sinh từ) thực thể đó. Ví dụ, một thực thể Danh bạ thể chứa các thuộc tính như tên, địa chỉ 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 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 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 "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 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ể 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:

Creating a new Core Data Entity Description in Xcode
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 đó 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):

Editing the properties of a Core Data entity description
Để 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ổ) 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 các lựa chọn khác được yêu cầu:

Defining attributes for a Core Data entity
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 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 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ệ:

Defining a relationship in a Core Data entity

Như đã chứng minh, Xcode làm cho quá trình 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 vượt quá phạm vi của cuốn sách này, 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 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 context như 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ể 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ỉ số điện thoại tương ứng, các giá trị của các thuộc tính này 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 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 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 các đối tượng đó 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 đượ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ư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