Nhiều bạn lập trình viện không có nhiều thời gian đến các trung tâm hoặc các trường học để có thể tham gia các khóa học lập trình iOS.Các bạn đang mong muốn tìm cho mình được 1 bộ tài liệu học lập trình iOS từ Cơ Bản – Chuyên Sâu. DevPro là một trong những trung tâm dạy lập trình iOS online, offline cho các bạn sinh viên, các nhân viên lập trình muốn tìm hiểu về ngôn ngữ thế hệ mới này để tạo cho mình 1 công việc và 1 mực lương tốt hơn trong cuộc sống. Nhưng không phải ai cũng có thời gian và điều kiện đến trung tâm để tham gia khóa học.Thấu hiểu được điều đó thì trung tâm DevPro đã xây dựng một bộ tài liệu học lập trình iOS từ Cơ Bản – Nâng cao giúp các bạn có thể tự học lập trình iOS tại nhà mà không phải tốn nhiều thời gian đến các trong tâm. MỤC LỤC Nhập môn ObjectiveC 2 Các kiểu dữ liệu cơ bản trong Objective C 2 Biến, hằng số, toán tử trong Objective C 5 Cấu trúc điều khiển trong Objective C 6 Cơ bản về hàm, class trong Objective C 9 Hướng dẫn cách sử dụng block trong Objective C 14 Cấu trúc của một chương trình trong lập trình IOS 17 Tạo ứng dụng Helloworld sử dụng Objective C (tạo ứng dụng Iphone đầu tiên trên iOS) 19 Tìm hiểu về Label, Button, TextField, Slider, Switch, Page Control trong iOS 24 Tìm hiểu về Progress View, Activity View, Segmented Control, Switch trong ios 29 Quản lý bộ nhớ trong IOS (Memory Management) 32 Điều hướng sử dụng Navigation controller 37 Hướng dẫn sử dụng Tabbar ViewController mở Webview, ImageView, Mapkit. 48 Hướng dẫn sử dụng file xib trong IOS. 59 Hướng dẫn sử dụng TableView trong IOS 64 Tương tác row selection trong Tableview 72 Hướng dẫn xóa 1 hàng trong TableView 76 Hướng dẫn sử dụng Sidebar 79 Hướng dẫn phân trang trong IOS sử dụng file xib 89 Hướng dẫn sử dụng CollectionView trong IOS 95 Hướng dẫn tương tác với CollectionView 105 Thêm Header và Footer trong UICollectionView 114 Phân tích XML parser 122 Hướng dẫn phân tích JSON 129 Hướng dẫn load dữ liệu từ Json vào TableView 143 Hướng dẫn Localization(đa ngôn ngữ) cho ứng dụng của bạn 155 Hướng dẫn thêm tính năng chia sẻ cho ứng dụng của bạn 163 Hướng dẫn sử dụng một máy quay và playback. 169 Hướng dẫn xây dung một máy ảnh đơn giản sử dụng UIImagePickkerViewcontroller 174 Vào ra file trong ios 179 AutoLayout trong ios 183 Hướng dẫn sử dụng SQLite trong ios 190 Hướng dẫn sử dụng Coredata trong ios 203
[Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu] Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu Nhiều bạn lập trình viện nhiều thời gian đến trung tâm trường học để tham gia khóa học lập trình iOS.Các bạn mong muốn tìm cho tài liệu học lập trình iOS từ Cơ Bản – Chuyên Sâu DevPro trung tâm dạy lập trình iOS online, offline cho bạn sinh viên, nhân viên lập trình muốn tìm hiểu ngôn ngữ hệ để tạo cho công việc mực lương tốt sống Nhưng có thời gian điều kiện đến trung tâm để tham gia khóa học.Thấu hiểu điều trung tâm DevPro xây dựng tài liệu học lập trình iOS từ Cơ Bản – Nâng cao giúp bạn tự học lập trình iOS nhà mà tốn nhiều thời gian đến tâm MỤC LỤC Nhập môn Objective-C Các kiểu liệu Objective C Biến, số, toán tử Objective C Cấu trúc điều khiển Objective C Cơ hàm, class Objective C Hướng dẫn cách sử dụng block Objective C 14 Cấu trúc chương trình lập trình IOS 17 Tạo ứng dụng Helloworld sử dụng Objective C (tạo ứng dụng Iphone iOS) 19 Tìm hiểu Label, Button, TextField, Slider, Switch, Page Control iOS 24 Tìm hiểu Progress View, Activity View, Segmented Control, Switch ios 29 Quản lý nhớ IOS (Memory Management) 32 Điều hướng sử dụng Navigation controller 37 Hướng dẫn sử dụng Tabbar ViewController mở Webview, ImageView, Mapkit 48 Hướng dẫn sử dụng file xib IOS 59 Hướng dẫn sử dụng TableView IOS 64 Tương tác row selection Tableview 72 Hướng dẫn xóa hàng TableView 76 Hướng dẫn sử dụng Sidebar 79 Hướng dẫn phân trang IOS sử dụng file xib 89 Hướng dẫn sử dụng CollectionView IOS 95 Hướng dẫn tương tác với CollectionView 105 Thêm Header Footer UICollectionView 114 Phân tích XML parser 122 Hướng dẫn phân tích JSON 129 Hướng dẫn load liệu từ Json vào TableView 143 Hướng dẫn Localization(đa ngôn ngữ) cho ứng dụng bạn 155 Hướng dẫn thêm tính chia sẻ cho ứng dụng bạn 163 Hướng dẫn sử dụng máy quay playback 169 Hướng dẫn xây dung máy ảnh đơn giản sử dụng UIImagePickkerViewcontroller 174 Vào file ios 179 AutoLayout ios 183 Hướng dẫn sử dụng SQLite ios 190 Hướng dẫn sử dụng Coredata ios 203 Page of 212 [Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu] I Nhập môn Xcode Objective-C Nhập môn Objective-C Objective-C ngôn ngữ Apple phát triển từ C có tính hướng đối tượng Cụ thể tính đối tượng hướng dẫn bạn học Để bắt đầu, bạn cần phải sử dụng hệ điều hành Mac OS (trên máy Mac Hackintosh) dĩ nhiên phải cài ứng dụng Xcode (do Apple phát triển cung cấp miễn phí) Để nhận dạng ứng dụng Xcode bạn nhìn vào hình nhé! II Bạn cần máy tính MAC OS hay Laptop tương thích Laptop cấu hình tốt… MAC OS giá đắt Laptop cài song song yêu cầu cấu hình tương thích, chạy ổn định MAC giá rẽ hợp sinh viên Laptop cấu hình mạnh, ram 8GB cài máy ảo yếu cài song song Bạn cần tạo tài khoản Apple ID để phát triển phầm mềm Vào trang để khởi tạo tài khoản https://appleid.apple.com Tải Xcode máy MAC từ MAC App Store Đăng nhập Apple ID để tải Xcode từ MAC App Store Sau cài đặt xong Một hoàn tất trình cài đặt, bạn tìm thấy Xcode phần Launchpad Các kiểu liệu Objective C Như bạn biết muốn tìm hiểu ngôn ngữ ban đầu ta tìm hiểu kiểu liệu chúng Việc nắm bắt phạm vi, cách dùng kiểu liệu giúp bạn lập trình không bị sai, hiểu cách quản lý đoạn code Bài giới thiệu cụ thể kiểu liệu nguyên thủy kiểu liệu đối tượng Objective C Các kiểu liệu nguyên thủy C Trong Objective C, hầu hết kiểu liệu ngôn ngữ lập trình C sử dụng cách trực tiếp bao gồm integer (int), float, char, double,float,enum, … Trong C++ dụng phải sử dụng file trung gian để kết nối Boolean bool Ký tự char byte [-127 tới 127 - 255] Page of 212 [Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu] Số nguyên Số thực Số thực dạng double Kiểu giá trị Kiểu wide character unsigned char signed char int unsigned int signed int short int unsigned short int signed short int long int unsigned long int signed long int float double long double void wchar_t byte byte byte byte byte byte Range Range byte byte byte byte byte byte [0 - 255] [-127 - 127] [-2147483648 - 2147483647] [0 - 4294967295] [-2147483648 - 2147483647] [-32768 - 32767] [0 - 65535] [-32768 - 32767] [-2147483647 - 2147483647] [0 - 4,294,967,295] [-2147483647 - 2147483647] [+/- 3.4e +/- 38 (~7 ký số)] [+/- 1.7e +/- 308 (~15 ký số)] [+/- 1.7e +/- 308 (~15 ký số)] byte [1 wide character] signed (kiểu có dấu) unsigned (kiểu dấu) short long Các kiểu Objective C sử dụng giống C bản! ! ! Ví dụ: cách khai báo int a = 5; float b = 5.5; double c = 11.11; char str[5] = “objec”; unsign int uI = 8; Các kiểu liệu đối tượng Objective C NSString Kiểu chuỗi ký tự Objective C Kiểu NSString thay đổi Ví dụ: khai báo NSString -NSString *str1 = [[NSString alloc] init]; //Khai báo cách NSString *str2 = @”test”; //Khai báo cách -NSData Dùng để chứa liệu binary Có thể dùng để chứa liệu binary files, video, image, audio,… NSObject Kiểu đối tượng gốc (root) tạo để đối tượng khác kế thừa id Kiểu đối tượng đại diện Objective C Nếu đối tượng kiểu id đối tượng NSMutableString Page of 212 [Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu] - - - III Kiểu chuỗi ký tự Objective C Kiểu NSMutableString thay đổi Lưu ý: NSMutableString không khai báo tắt theo cách (phần ví dụ NSString) NSArray Kiểu đối tượng mảng chứa kiểu liệu khác, bao gồm nhiều kiểu liệu Không thể thay đổi nội dung mảng Duyệt mảng thông qua giá trị số mảng (index) Ví dụ -//Cách khai báo NSArray *arr1=[[NSArray alloc]initWithObjects:@"ngo",@(5), nil]; //Cách khai báo arr0=@[@(1),@"2"]; -NSMutableArray Tương tự NSArray thay đổi nội dung mảng NSDictionary Kiểu liệu từ điển gồm khóa(key) giá trị (value) từ khóa Không thể thay đổi nội dung Ví dụ -//Cách NSDictionary *dict1=[[NSDictionary alloc]initWithObjectsAndKeys:@(1),@"key",@(2),@"key1", nil]; //Cách NSDictionary *dict=@{@"key1":@(1),@"key":@(2)}; -NSMutableDictionary Giống NSDictionary thay đổi nội dung NSNumber Là kiểu liệu số loại số (int, float, double, long,…) NSInteger Kiểu liệu tương tự int C CGFloat Tương tự kiểu nguyên thủy float framework graphic tùy biến thành CGFloat true/false hay YES/NO Có kiểu BOOL (8bit) : YES/NO dùng Objective C bool (16/32/64/… bit tùy môi trường) : true/false Boolean (8bit) : TRUE/FALSE Ví dụ -Boolean boolA = TRUE; bool boolB = true; BOOL boocC = YES; Biến, số, toán tử Objective C Ở phần trước làm rõ khái niệm kiểu liệu, giới thiệu kiểu liệu nguyên thủy c, c++, kiểu liệu đối tượng Objective C Mình sử dụng biến để thử kiểu liệu Bài làm rõ biến gì? , số gì?, cách dùng? Giới thiệu loại `11`toán tử … Page of 212 [Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu] Biến +) Bộ nhớ máy tính tổ chức đơn vị nhỏ là ô nhớ (đơn vị byte) Biến lưu ô nhớ nhớ máy tính, dành riêng để lưu trữ liệu truy xuất giá trị +) Mỗi biến có tên riêng lưu trữ giá trị riêng tùy vào kiểu liệu +) Mỗi biến giá trị tự nhớ ứng dụng ngừng chạy +) Giá trị biến thay đổi +) Cách truy xuất biến Objective C, ? Mình minh họa số ví dụ sau: Ví dụ Cách khai báo biến: kiểu liệu [tên biến] = giá trị biến; -//int[kiểu liệu] bien[tên biến] = 8[giá trị biến]; int bien = 8; -Giá trị biến thay đổi -int a = 1; int b = 2; a = a+b; //Kết trả a = 3; -Hằng số Hằng số biến, khai báo biến thường hay biến trỏ Biến số: có giá trị thay đổi toàn ứng dụng Giá trị biến số gán sau khai báo biến Hằng số thường khai báo đầu đoạn code Class chạy ứng dụng Khai báo: { int const hangSoA = 8; } Chúng ta thay đổi giá trị hangSoA khai báo Nếu thay đổi chương trình báo lỗi chạy Toán tử Toán để gán : “=” Dùng để gán giá trị cho biến, dùng để gán biến cho biến gán hàm cho biến Ví dụ -int a = 6; int b = a; -Toán tử số học : “+-*/%” + phép cộng, - phép trừ, * phép nhân, / phép chia Dùng để cộng, trừ, nhân, chia biến % phép lấy số dư Ví dụ -int a = 1; int b = 2; int cong = a + b; //trả int tru = b – a; //trả int nhan = a * b; //trả Page of 212 [Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu] - - - - - IV int chia = b / a; //trả int du = a % b; //trả -Toán tử phức hợp : “+=, -=, *=, /=” Ví dụ -int a = 1; a += 1; //Tương đương với a = a + (2) Áp dụng với phép toán khác -Toán tử tăng, giảm giá trị : “++, ” Ví dụ -int i = 1; i++; //Tăng đơn vị (i = i +1) i ; //Giảm đơn vị (i = i – 1) -Toán tử quan hệ : “==, !=, >=, , ” : lớn “=”: lớn “b?NSLog(@“dung”):NSLog(@”sai”); //Nếu a > b trả “dung”, ngược lại “sai” Cấu trúc điều khiển Objective C Bài giới thiệu cấu trúc điều khiển Objective C Cũng giống ngôn ngữ khác cấu trúc điều khiển quan trọng, giúp điều hướng code, chạy giải thuật cách tuyệt vời Để giúp bạn hiểu rõ, giới thiệu cụ thể cách khai báo cách dùng cấu trúc cách cụ thể Cấu trúc IF, IF ELSE kiểm tra true or false: IF : Cấu trúc if thực điều kiện trả Khai báo tổng quát if(điều kiện đúng){ //Thực điều kiện } Ví dụ Page of 212 [Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu] //Khai báo biến int tuoi = 22; NSString *ten = @”Nguyen Van A”; //Kiểm tra điều kiện if(tuoi==22&&[ten isEqualToString:@”Nguyen Van A”]){ NSLog(@“Tuoi cua %@ la %d”, ten, tuoi); } //Trường hợp log kết tên “Nguyen Van A” tuổi 22 IF ELSE : Khi điều kiện thực lệnh if, ngược lại điều kiện sai thực lệnh else Khai báo tổng if(điều kiện){ //Thực điều kiện } else{ //Thực điều kiện sai } Ví dụ if([ten isEqualToString:@”Nguyen Van B”]){ //Nếu tên “Nguyen Van B” log “Day la B” NSLog(@”Day la B”); } else{ //Ngược lại log “Day khong phai la B” NSLog(@”Day khong phai la B”); } - -Vòng lặp Vòng lặp hữu hạn : biết số lần lặp for(giá trị biến khởi tạo; điều kiện lặp; bước nhảy sau lần lặp){ //code } Đầu tiên khai báo biến khởi tạo gán giá trị khởi tạo, kiểm tra biến khởi tạo thoả mãn điều kiện thực dòng code bên thân hàm for, cuối tăng biến khởi tạo theo bước nhảy, không thoả mãn thoát khỏi vòng for vòng lặp thực đến out vòng for Ví dụ -//Log số tự nhiên từ đến 10 for(int i = 1; i = 5, lặp hữu hạn với điều kiện, kết : Trong trường hợp muốn vòng lặp while thực lần, điều kiện ta thực vòng lặp while Ví dụ -int a = 6; do{ NSLog(@”%d”, a); } while(a < 5); -a (6) log lần dù không thỏa mãn điều kiện while (a < 5) Cấu trúc điều khiển với nhiều lựa chọn Chúng ta sử dụng IF lồng để đưa nhiều lựa chọn với nhiều điều kiện khác Tuy nhiên nhìn code rắc rối khó quản lý, Ở Objective C ngôn ngữ khác, có hỗ trợ kiểu nhiều lựa chọn switch(biến){ case [điều kiện 1]: break; Page of 212 [Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu] case [điều kiện 2]: break; default: break; } Với điều kiện truyền vào, điều kiện kiểm tra xem với case thực lệnh case Nếu không với case nào, thực dòng lệnh default Và có nhiều lựa chọn Ví dụ -int a = 1; switch(a){ case 1: NSLog(@"true 1"); break; case 2: NSLog(@"true 2"); break; default: NSLog(@"default"); break; } -Ở điều kiện truyền vào a, với a = 1, thực case : Trả kết “true 1” Full code ví dụ http://www.mediafire.com/file/f7q3t3p0p6lg4v2/cauTrucDieuKhien%282%29.zip V Cơ hàm, class Objective C Trong viết này, giới thiệu khái niệm “hàm ” “class” Objective C Mình giúp bạn biết cách khai báo hàm, class, cách gọi hàm , gọi class, hiểu tính chất class, Cách truyền tham số cho hàm… Khởi tạo dự án đặt tên: Page of 212 [Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu] Đầu tiên giới thiệu hàm Objective C : làm việc file ViewController.m Cách khai báo hàm tổng quát: -(void) tenham{ //code thực thi } Đơn giản khai báo hàm tham số truyền vào -(void) tenham{ NSLog(@”test”); } Hàm có tham số truyền vào Tổng quát : Đối với nhiều tham số truyền vào, (kiểu liệu)tênBiến1 :(kiểu liệu)tênBiến2 lưu ý: Sau tên Biến phải có dấu cách xong đến dấu ‘:‘ -(void) tenham: ([kiểu liệu])tenbien1 nhacnho:([kiểu liệu]tenbien2{ } Ví dụ : tính tổng a b (void) tong:(int)soA : (int)soB{ int tong = soA + soB; NSLog(@”%d”, tong); -} Hàm có tham số truyền vào thêm gợi ý chức hàm -(void) tenham : (kiểu liệu)tenbien goiy: (kiểu liệu) tenbien{ //code } lưu ý: Sau tên Biến phải có dấu cách xong đến gợi ý đến dấu ‘:‘ Ví dụ (void) tong: (int)soA Cong: (int)soB{ int tong = soA + soB; Page 10 of 212 [Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu] Mình giới thiệu cho bạn khái quát số hàm Sqlite: sqlite3_open : Chức sử dụng để tạo mở tập tin sở liệu Nếu file không tồn tạo sau mở file, tồn mở file sqlite3_prepare_v2 : Mục đích chức để có câu lệnh SQL (truy vấn) định dạng chuỗi, chuyển sang định dạng thực thi nhận biết SQLite sqlite3_step : Chức thực thực câu lệnh SQL (query) chuẩn bị chuẩn sqlite sqlite3_column_count : Nó trả tổng số cột (trường) bảng sqlite3_column_text : Phương pháp trả nội dung Ô mẫu giá trị cột , trả định dạng chuỗi C ( char * ) sqlite3_column_name : Nó trả tên cột(trường) sqlite3_changes : Nó thực trả số lượng hàng bị ảnh hưởng, sau thực truy vấn sqlite3_last_insert_rowid : Nó trả ID chèn vào hàng cuối bảng sqlite3_errmsg : Nó trả lỗi mô tả SQLite sqlite3_finalize : Nó xóa câu truy vấn chuẩn bị trước sqlite3_close : Đóng CLDL DBManager.h @property (nonatomic, strong) NSMutableArray *arrColumnNames;// lưu lại tổng số cột bảng @property (nonatomic) int affectedRows;// trả số lượng hàng bị ảnh hưởng @property (nonatomic) long long lastInsertedRowID;// trả vê ID Kết nối: file DBManager.m: Mình comment cụ thể dòng lệnh bên đoạn mã sau: Mình khái quát lại nguyên lý đoạn mã sau: Hàm truyền vào tham số : câu lệnh truy vấn, biến trạng thái truy vấn: – Chuẩn bị đường dẫn đích đến file, Ban đầu mở file, không thành công tạo file không làm cả, Nếu mở file thành công: -> Chuẩn bị câu truy vấn chuẩn nhận dạng Sqlite3, Nếu câu truy vấn sai thông báo lỗi mô tả sqlite3, Nếu chuẩn: Ở ta tách hai hướng: Hướng :(Nếu tham số truyền queryExecutable==NO) Truy vấn có lấy thông tin ghi, trích lọc liệu, lấy danh sách ghi(select)… Và ta thực truy vấn để lấy ghi Hướng 2: (Nếu ta truyền tam số queryExecutable==YES) truy vấn không lấy ghi (UPDATE,DELETE,INSERT,CREATE TABLE); Cụ thể dòng code đoạn mã : Page 198 of 212 [Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu] // Chuẩn mở file sqlite truy vấn sqlite // truyền vào tham số : câu truy vấn đối tượng bool để kiểm tra: update,delete, insert, create không lấy liệu ra,chỉ truy vấn: Trích lọc lấy liệu truy vấn lấy bảng liệu // truyền vào kiểu char Sqlite NSString gì, cho phép làm việc với char -(void)runQuery:(const char *)query isQueryExecutable:(BOOL)queryExecutable{ // Khởi tạo đối tượng class sqlite sqlite3 *sqlite3Database; // Lấy đường dẫn đích đến file.sqlite NSString *databasePath = [self.documentsDirectory stringByAppendingPathComponent:self.databaseFilename]; // Khởi tạo mảng kết if (self.arrResults != nil) {// mảng tồn tại(lưu) đối tượng [self.arrResults removeAllObjects];//xoá tất đối tượng self.arrResults = nil;// set nil } self.arrResults = [[NSMutableArray alloc] init];// khởi tạo lại vùng nhớ cho mảng // Tương tự mảng chứa trường tên cột if (self.arrColumnNames != nil) { [self.arrColumnNames removeAllObjects]; self.arrColumnNames = nil; } self.arrColumnNames = [[NSMutableArray alloc] init]; // Mở sở liệu // truyền vào tham số đường dẫn đích đến file định dạng UTF8, Đối tượng sqlite BOOL openDatabaseResult = sqlite3_open([databasePath UTF8String], &sqlite3Database); if(openDatabaseResult == SQLITE_OK) {// mở csdl thành công // Đối tượng lưu trữ truy vấn prepare statement sqlite3_stmt *compiledStatement; // Chuyển đổi câu truy vấn định dạng chuỗi sang câu truy vấn mà sqlite3 nhận dạng được! // tham số truyền vào đối tượng sqlite3, câu truy vấn,Lấy độ dài câu truy vấn, -1 độ dài tuỳ ý, đối tượng sqlite3_stmt lưu trữ truy vấn, Con trỏ trỏ tới phần chưa sử dụng câu truy vấn Sql // sau chuyển đổi câu truy vấn lưu lại compiledStatement BOOL prepareStatementResult = sqlite3_prepare_v2(sqlite3Database, query, -1, &compiledStatement, NULL); // Nếu câu truy vấn chuyển đổi thành công sang dạng sqlite nhận dạng đc if(prepareStatementResult == SQLITE_OK) { // Kiểm tra truyền vào QueryExecutable NO ta cần trích lọc liệu , đọc liệu if (!queryExecutable){ // Tạo mảng lưu lại thông tin truy vấn! NSMutableArray *arrDataRow; // Thực thi truy vấn cho phép đọc thành công! while(sqlite3_step(compiledStatement) == SQLITE_ROW) { Page 199 of 212 [Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu] // Khởi tạo mảng arrDataRow = [[NSMutableArray alloc] init]; // trả tổng số cột int totalColumns = sqlite3_column_count(compiledStatement); //lặp hết cột for (int i=0; i 0) {// môt đối tượng arrResults mảng! [self.arrResults addObject:arrDataRow]; } } } else { // Nếu truy vấn Update , Delete, insert không cần đưa liệu // Execute the query int executeQueryResults = sqlite3_step(compiledStatement); if (executeQueryResults == SQLITE_DONE) {// Nếu truy vấn thành công "chỉ truy vấn không đọc liệu" // // Trả số lượng hàng bị ảnh hưởng // self.affectedRows = sqlite3_changes(sqlite3Database); // // // trả số đối tượng chèn vào dòng cuối // self.lastInsertedRowID = sqlite3_last_insert_rowid(sqlite3Database); } else { // Lỗi mô tả sqlite NSLog(@"DB Error: %s", sqlite3_errmsg(sqlite3Database)); } } } else { Page 200 of 212 [Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu] // In the database cannot be opened then show the error message on the debugger // Nếu xảy lỗi mô tả sqlite NSLog(@"%s", sqlite3_errmsg(sqlite3Database)); } // Giải phóng truy vấn chuẩn bị sqlite3_finalize(compiledStatement); } // Đóng lại CSDL sqlite3_close(sqlite3Database); } Như truy vấn sqlite, Tuy nhiên để cụ thể cọn gàng thêm hai hàm sau DBManager.h: hàm giúp ta thực loại truy vấn tách thành hướng phía trên: -(NSArray *)loadDataFromDB:(NSString *)query;// Truy vấn có đọc liệu -(void)executeQuery:(NSString *)query;// truy vấn không đọc liệu DBManager.m để thực thi : – Đối với hàm cần trích lọc ghi: Ta trả mảng lưu lại ghi truy vấn được, truyền vào tham số: câu truy vấn ,và queryExecutable==NO; – Đối với hàm truy vấn: ta cần truyền vào Câu truy vấn ,queryExecutable==YES, không cần trả ghi! -(NSArray *)loadDataFromDB:(NSString *)query{ [self runQuery:[query UTF8String] isQueryExecutable:NO]; return (NSArray *)self.arrResults; } -(void)executeQuery:(NSString *)query{ [self runQuery:[query UTF8String] isQueryExecutable:YES]; } => Như đối vơi class bên cần truyền vào câu truy vấn chuẩn sqlite thực thi! Bắt đầu truy vấn nào: 🙂 vào ViewController.h : #import "DBManager.h" Page 201 of 212 [Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu] Tạo đối tượng dbManager @property DBManager *dbManager; Trong ViewDidLoad: Truyền vào tên file sqlite Tạo hàm: excuteQueryInsert: chèn thêm đối tượng vào bảng loadDataInfor: trả thông tất thông tin bảng - (void)viewDidLoad { [super viewDidLoad]; self.dbManager = [[DBManager alloc] initWithDatabaseFilename:@"infor.sql"]; [self executeQueryInsert]; [self loadDataInfor]; } Thực thi hai hàm khởi tạo bên trên: Tạo câu truy vấn sql tham khảo đây: sau gọi hàm truy vấn bên class DBManager Link : https://www.w3schools.com/sql/ -(void) loadDataInfor{ // Form the query NSString *query = @"SELECT * FROM ThongTin"; //NSString *query = @"select * from peopleInfo"; NSArray *arr;//=[[NSArray alloc]init]; arr = [[NSArray alloc] initWithArray:[self.dbManager loadDataFromDB:query]]; NSLog(@"%@",arr); // Reload the table view } -(void) executeQueryInsert{ NSString *query=@"INSERT INTO ThongTin VALUES ('5','Nam','22')"; NSArray *arr;//=[[NSArray alloc]init]; arr = [[NSArray alloc] initWithArray:[self.dbManager loadDataFromDB:query]]; } Như hướng dẫn cụ thể sqlite! Link full code : http://www.mediafire.com/download/b1efpiyht6ceftp/sqlite+2.zip Page 202 of 212 [Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu] XXXIII Hướng dẫn sử dụng Coredata ios Mình giới thiệu bạn sử dụng Sqlite trong ios Bài giới thiệu công cụ lưu trữ liệu có cấu trúc khác, có lập trình IOS framework CoreData Core data khác so với sqlite? Core data không sử dụng câu truy vấn sql để gọi liệu trường mà gọi đối tượng với thông tin đối tượng Coredata làm việc context ảnh chụp dataBase, truy vấn xử lý context cuối save database xuống, sqlite làm việc trực tiếp với database thay đổi database, sử dụng coredata thay đổi liệu tuỳ ý chưa cho phép save không ảnh hưởng đến liệu Ngoài core data xcode suport cho hệ quản trị sở liệu dành riêng để thiết kế Ưu điểm, nhược điểm core data so với sqlite nhiều bạn tìm hiểm thêm, vào cụ thể cách sử dụng coredata Trước tiên tạo dự án đặt tên coreData: – Giới thiệu coreData: Core Data lưu trữ liệu qua phiên làm việc, ứng dụng kết thúc liệu tồn Core Data lưu liệu tầng vật lý có dạng: Binary,Xml,Sqlite, InMemory Khi load liệu lên thông qua core data chuyển tất liệu thành đối tượng để truy vấn Core data hệ quản trị ORM (Object-relational mapping) ánh xạ liệu quan hệ từ phía lưu trữ vật lý lên thành đối tượng phía để làm việc Core Data suport thứ quý context giải thích phía Một số đối tượng quản lý core data: NSManagedObjectModel: Chứa toàn mặt ngữ nghĩa, format csdl, tạo model cách kéo thả, design, tạo thành file thiết kế NSPersistentStoreCoordinator: Ghi liệu từ phía xuống thành liệu vật lý lưu trữ phía chuyển đọc liệu lên NSManagedObjectContext: Là ngữ cảnh, ảnh database thời điểm đó, làm việc Context, cuối save liệu xuống Nếu chưa save liệu data không bị ảnh hưởng Snapshot of database ảnh Database, cần cần làm context ? Khi liệu vật lý có nhiều User chọc vào, có user đọc, có user ghi phần này, có user ghi phần kia, liệu bị xung đột, nên sinh khái niệm context, save data ảnh hưởng đến liệu vật lý, tất thao tác xử lý xung đột xử lý Page 203 of 212 [Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu] tự động, trừ trường hợp user thực delete liệu, user khác save liệu liệu vật lý thật bị xoá hệ thống thông báo lỗi cần xử lý thủ công NSManagedObject: Cho phép Update entity, Insert entity,Delete entity Model design NSFetchRequest: Đọc liệu -Thêm Framework: – Thiết kế mô hình coreData: Mình tạo 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 Chọn next-> đặt tên “studentModel”-> chọn vào nút create tạo model coredata Page 204 of 212 [Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu] Thiết kế: Đặt tên ENTITIES “Student”, Thêm thuộc tính cho entities “Student” : Attribute : studentId kiểu liệu Integer 16, name kiểu liệu String sau thêm trông ảnh sau: Ralationships:Quan hệ bảng Fetched Properties, bạn tham khảo thêm đơn giản giúp cácbạn truy vấn bảng Student Một số lựa chọn thuộc tính: click vào tên thuộc tính ví dụ name, bên phải xuất lựa chọn thuộc tính: Transient : Nếu tích vào giá trị cho thuộc tính, liệu nháp, không lưu vào database, ví dụ thuộc tính tuổi suy từ thuộc tính ngày tháng năm sinh ta không cần lưu tuổi mà cần lấy để so sánh tuổi chẳng hạn Page 205 of 212 [Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu] Optional: Khi tick vào giá trị thuộc tính không cần truyền giá trị vào Indexed: Khi tick vào giá trị thuộc tính dùng cho thuộc tính key Index in Spotlight: đánh mục tăng khả tìm kiếm Store in External Record File: Ghi liệu file không ghi vào database Cuối hệ csdl 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) lựa chọn Có kiểu xem Editor (bảng), 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 Chọn vào model cần update,insert->next-> chọn vào entity cần thay đổi ->next->create -> update insert thành công minh hoạ: Page 206 of 212 [Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu] Như tạo mô hình Core Data: “Student” -Kết nối mở model để đọc ghi liệu: Trong ViewController.m! Vào ViewDidload: Khởi tạo hàm kết nối mở model CoreData:”initializeCoreData” - (void)viewDidLoad { [super viewDidLoad]; [self initializeCoreData]; } Định nghĩa initializeCoreData: Thêm đoạn mã sau: Để lưu model vào thư mục documents, mở model “đơn giản thư mục Resource readonly không cho thay đổi thông tin” Page 207 of 212 [Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu] Trong mã code giải thích cụ thể dòng lệnh: -(void) initializeCoreData{ // Lấy đường dẫn Resource NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"studentModel" withExtension:@"momd"]; // Khởi tạo đối tượng Model lên theo url resource -> Đối tượng lưu lại Model NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; // Có thể sinh lỗi sai tên file or đuôi file if (mom == nil) { NSLog(@"Error initializing Managed Object Model"); return; } // Cầu nối liệu với nơi lưu trữ vật lý Đọc Load Model lên ghi xuống NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom]; // Đối tượng quản lý file NSFileManager *fileManager = [NSFileManager defaultManager]; // lấy đường dẫn đến thư mục docments ứng dụng NSURL *documentsURL = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject]; // Tạo đường dẫn đích đến file , tạo file infor null NSURL *storeURL = [documentsURL URLByAppendingPathComponent:@"Student.sqlite"]; NSError *error = nil; //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 lỗi lưu, cấu hình bổ xung cho file sqite, options tuỳ chọn khác khác vs sqlite copy resource lưu model NSPersistentStore *store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]; // Nếu lỗi file if (store == nil) { NSLog(@"Error initializing PSC: %@\n%@", [error localizedDescription], [error userInfo]); } // tạo đối tượng context NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; // set model cho đối tượng (context) moc [moc setPersistentStoreCoordinator:psc]; // set context cho property self.ManagedObjectContext = moc; } Tiếp theo truy vấn thông tin Entity Student: Trong main.StoryBoard, thiết kế giao diện sau: Đưa vào button đặt tên hình, minh hoạ cho chức thực thể Student Page 208 of 212 [Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu] Ánh xạ button đặt tên file ViewController.h: - (IBAction)Update:(id)sender; - (IBAction)Show:(id)sender; - (IBAction)Add:(id)sender; - (IBAction)Delete:(id)sender; - (IBAction)Filter:(id)sender; Thêm đối tượng để lưu context tiện truy vấn: @property(nonatomic,strong)NSManagedObjectContext *ManagedObjectContext; – Add: Thêm 100 đối tượng Student: giải thích code // Thêm 100 đối tượng student - (IBAction)Add:(id)sender { for (int i=0; i