Bài này mình sẽ giới thiệu một công cụ lưu trữ dữ liệu có cấu trúc khác, chỉ có trong lập trình IOS framework CoreData.. Core data không sử dụng các câu truy vấn của sql để gọi dữ liệu c
Trang 1HƯỚNG DẪN SỬ DỤNG COREDATA TRONG IOS
Mình đã từng giới thiệu các bạn sử dụng Sqlite trong trong ios Bài này mình
sẽ giới thiệu một công cụ lưu trữ dữ liệu có cấu trúc khác, chỉ có trong lập trình IOS framework CoreData Core data khác gì so với sqlite? Core data không
sử dụng các câu truy vấn của sql để gọi dữ liệu của các trường mà gọi từng đối tượng với các thông tin của đối tượng đó Coredata làm việc trên context như một ảnh chụp của dataBase, chúng ta truy vấn xử lý trên context cuối cùng chúng ta mới save database xuống, sqlite làm việc trực tiếp với database thay đổi trên database, như thế sử dụng coredata chúng ta có thể thay đổi dữ liệu tuỳ ý nếu chưa cho phép save thì không ảnh hưởng đến dữ liệu Ngoài ra core data còn được xcode suport cho cả hệ quản trị cơ sở dữ liệu dành riêng để thiết kế Ưu điểm, nhược điểm core data so với sqlite còn rất nhiều các bạn có thể tìm hiểm thêm, mình sẽ đi vào cụ thể cách sử dụng coredata
Trang 2Trước tiên chúng ta tạo dự án mới và đặt tên coreData:
– Giới thiệu về coreData:
Core Data lưu trữ dữ liệu qua các phiên làm việc, khi ứng dụng kết thúc dữ liệu vẫn tồn tại Core Data lưu dữ liệu dưới tầng vật lý có 4 dạng: Binary,Xml,Sqlite, InMemory Khi load dữ liệu lên thông qua core data sẽ chuyển tất cả dữ liệu thành
đối tượng để chúng ta truy vấn Core data là hệ quản trị ORM (Object-relational
Trang 3mapping) ánh xạ dữ liệu quan hệ từ phía lưu trữ vật lý lên thành các đối tượng phía trên để chúng ta làm việc Core Data suport một thứ rất quý đó là context như mình đã giải thích phía trên
Một số đối tượng quản lý core data:
NSManagedObjectModel: Chứa toàn bộ về mặt ngữ nghĩa, format
của csdl, tạo model bằng cách kéo thả, design, tạo thành một file thiết kế
NSPersistentStoreCoordinator: Ghi dữ liệu từ phía trên xuống thành
dữ liệu vật lý lưu trữ ở phía dưới và chuyển đọc dữ liệu lên
NSManagedObjectContext: Là một ngữ cảnh, ảnh của database tại
thời điểm đó, chúng ta có thể làm việc trên Context, cuối cùng chúng ta mới save dữ liệu xuống Nếu chưa save thì dữ liệu data không bị ảnh hưởng Snapshot of database ảnh của Database, vì sao cần chúng ta cần làm trên context ? Khi dữ liệu vật lý có nhiều User cùng chọc vào, khi đó có user đọc,
có user ghi phần này, có user ghi phần kia, khi đó dữ liệu sẽ bị xung đột, nên sinh ra khái niệm context, chỉ khi nào chúng ta save data mới ảnh hưởng đến
dữ liệu vật lý, tất cả thao tác xử lý xung đột sẽ được xử lý tự động, chỉ trừ trường hợp một user đã thực delete dữ liệu, một user khác save dữ liệu đó khi đó dữ liệu vật lý thật đã bị xoá khi đó hệ thống sẽ thông báo lỗi và chúng
ta cần xử lý thủ công
entity,Delete entity trên Model design
NSFetchRequest: Đọc dữ liệu ra
Trang 4-Thêm Framework:
– Thiết kế mô hình coreData:
Mình sẽ tạo ra một mô hình Student gồm: name, studentId
Vào File->New->File: chọn vào Core Data-> chọn vào Data Model
Trang 6Chọn next-> đặt tên là “studentModel”-> chọn vào nút create như vậy chúng ta
đã tạo ra model coredata
Thiết kế:
Đặt tên ENTITIES là “Student”, Thêm thuộc tính cho entities “Student” :
Attribute : studentId kiểu dữ liệu Integer 16, name kiểu dữ liệu String sau khi thêm chúng ta sẽ trông như ảnh sau:
Ralationships:Quan hệ giữa các bảng và Fetched Properties, các bạn có thể tham khảo thêm ở đây mình chỉ đơn giản giúp cácbạn truy vấn một bảng Student
cơ bản
Trang 7Một số lựa chọn của thuộc tính:
click vào tên thuộc tính ví dụ như name, bên phải sẽ xuất hiện các lựa chọn thuộc tính:
Trang 8Transient : Nếu tích vào thì giá trị cho thuộc tính, sẽ là dữ liệu nháp, không được lưu vào database, ví dụ như thuộc tính tuổi được suy ra từ thuộc tính ngày tháng năm sinh khi đó ta không cần lưu tuổi mà chỉ cần lấy ra để so sánh tuổi chẳng hạn
Optional: Khi tick vào thì giá trị thuộc tính có thể không cần truyền giá trị
Trang 9Cuối hệ csdl có các thông tin: Add entity thêm thực thể( thêm bảng mới), Add Attribute( thêm thuộc tính cho bảng) nào đó chúng ta lựa chọn
Có 2 kiểu xem Editor (bảng), và Style (giao diện trực quan)
Nếu có nhu cầu Update, insert thông tin hệ csdl core data, Chọn File ->
new->File->Core Data->NSManagedObject subclass
Trang 10
Chọn vào model cần update,insert>next> chọn vào entity cần thay đổi
->next->create -> như thế là chúng ta đã update insert thành công
có thể minh hoạ:
Trang 11
Như vậy chúng ta đã tạo được mô hình Core Data: “Student”
Trang 12-Kết nối mở model để đọc ghi dữ liệu:
Thêm đoạn mã sau: Để sao lưu model vào thư mục documents, và mở model
“đơn giản thư mục Resource chỉ readonly không cho thay đổi thông tin”
Trong mã code mình đã giải thích rất cụ thể từng dòng lệnh:
1 - void) initializeCoreData{
2 // Lấy đường dẫn Resource
Trang 138 NSLog(@"Error initializing Managed Object Model");
13 // Đối tượng quản lý file
14 NSFileManager *fileManager = [NSFileManager defaultManager];
15 // lấy đường dẫn đến thư mục docments của ứng dụng
URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject];
17 // Tạo đường dẫn đích đến file , tạo file infor null
URLByAppendingPathComponent:@"Student.sqlite"];
19
20 NSError *error = nil;
21 //NSPersistentStoreCoordinator lớp gộp sử dụng NSPersistentStore-> đối tượng thông tin lưu trữ model, để lưu trữ theo kiểu type nào, Tên file, Đưa ra lỗi khi lưu, cấu hình bổ xung cho file sqite, options tuỳ chọn khác khác vs sqlite chỉ copy bởi vì ở đây resource lưu model
addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error];
23 // Nếu lỗi file
24 if (store == nil) {
Trang 1425 NSLog(@"Error initializing PSC: %@\n%@", [error localizedDescription], [error userInfo]);
26 }
27 // tạo một đối tượng context
28 NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
29 // set model cho đối tượng (context) moc
Tiếp theo là truy vấn thông tin Entity Student:
Trong main.StoryBoard, thiết kế giao diện như sau:
Đưa vào 5 button đặt tên như hình, minh hoạ cho 5 chức năng cơ bản của thực thể Student
Trang 15Ánh xạ button và đặt tên trong file ViewController.h:
1 - (IBAction)Update:(id)sender;
2 - (IBAction)Show:(id)sender;
3 - (IBAction)Add:(id)sender;
Trang 16– Add: Thêm 100 đối tượng Student: mình đã giải thích trong code
1 // Thêm 100 đối tượng student
2 - (IBAction)Add:(id)sender {
3 for (int i=0; i<100;i++) {
4 // Giống như đối tượng=[kiểudữliệu new] tạo mới một đối tượng trỏ vào vùng nhớ
5 // Ở đây tương tự, đó là tạo mới một đối tượng s vào trong Entity Student, Trên context
Trang 1714 NSLog(@"Error saving context %@\n%@",[error localizedDescription],[error userInfo]);
12 // trả về số lượng phần tử trong mảng results
13 NSLog(@"%d results ",results.count);
14 for (Student *s in results) {
15 // log ra thông tin Student
16 NSLog(@"%@- %@",s.studentId,s.name);
17 }
Trang 1812 // trả về số lượng phần tử trong mảng results
13 NSLog(@"%d results ",results.count);
14 for (Student *s in results) {
15 // xoá tất cả các đối tượng
Trang 1912 // trả về số lượng phần tử trong mảng results
13 NSLog(@"%d results ",results.count);
14 for (Student *s in results) {
15 // đổi name thành chữ hoa
16 s.name=[s.name uppercaseString];
Trang 205 // set các điều kiên cho request
6 // set lấy mẫu dữ liệu
7 [request setPredicate:[NSPredicate predicateWithFormat:@"name like
%@",name]];
8 // set sắp xếp tăng
9 [request setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"studentId" ascending:YES]]];
10 NSError *error=nil;
11 // Truy vấn trả về mảng đối tượng lấy mẫu như như trên lưu trong results
Trang 2112 NSArray *results=[self.ManagedObjectContext executeFetchRequest:request error:&error];
13 // không có bản ghi thì trả vể error
18 // trả về số lượng phần tử trong mảng results
19 NSLog(@"%d results ",results.count);
20 // log ra giá trị studentId và name
21 for (Student *s in results) {