1. Trang chủ
  2. » Công Nghệ Thông Tin

HƯỚNG dẫn sử DỤNG SQLITE TRONG IOS

20 296 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 20
Dung lượng 786,38 KB

Nội dung

HƯỚNG DẪN SỬ DỤNG SQLITE TRONG IOS Sqlite gì? Công cụ hỗ trợ tạo file Sqlite ? Truy vấn sqlite lập trình IOS… Tất câu hỏi trả lời cho bạn hướng dẫn SQLite thư viện phần mềm mà triển khai SQL Database Engine truyền thống, không cần Server, không cần cấu hình nhỏ gọn SQLite Database Engine phát triển nhanh nhất, phát triển mặt tính phổ biến, mặt kích cỡ SQLite mã nguồn mở SQLite gì? Nói cách đơn giản SQLite phần mềm quản lý sở liệu (DBMS) tương tự Mysql, PostgreSQL… Đặc điểm SQLite gọn, nhẹ, đơn giản Chương trình gồm file vỏn vẹn chưa đến 400kB, không cần cài đặt, không cần cấu hình hay khởi động mà sử dụng Dữ liệu Database lưu file Không có khái niệm user, password hay quyền hạn SQLite Database SQLite không thích hợp với hệ thống lớn quy mô vừa tầm SQLite phát huy uy lực không yếu mặt chức hay tốc độ Với đặc điểm SQLite sử dụng nhiều việc phát triển, thử nghiệm … lưa chọn phù hợp cho người bắt đầu học Database SQLite Engine không Standalone Process giống sở liệu khác, bạn liên kết cách tĩnh cách động tùy theo yêu cầu với ứng dụng bạn SQLite truy cập file lưu giữ cách trực tiếp Tại nên sử dụng SQLite?  SQLite không yêu cầu tiến trình Server riêng rẽ để hoạt  SQLite không cần cấu hình, nghĩa không cần thiết phải cài  Một SQLite Database đầy đủ lưu giữ disk file  SQLite nhỏ gọn, nhỏ 400kB đươc cấu hình đầy động đặt đơn đủ nhỏ 250kB bỏ qua tính tùy ý  SQLite tự chứa, nghĩa phụ thuộc vào ngoại  Các Transaction SQLite tuân theo đầy đủ chuẩn vi ACID, đảm bảo truy cập an toàn từ nhiều tiến trình thread  SQLite hỗ trợ hầu hết tính ngôn ngữ truy vấn chuẩn SQL92  SQLite viết ANSI-C cung cấp API đơn giản dễ dàng sử dụng  SQLite có sẵn UNIX (Linux, Mac OS-X, Android, iOS) Windows (Win32, WinCE, WinRT) Công cụ tạo file sqlite: Tải firefox cài đặt: https://www.mozilla.org/vi/firefox/new/ Sau cài đặt xong mở fireFox: Chọn vào biểu tượng gạch hình vẽ, Chọn Addons, Vào ô search tìm kiếm “sqlite manager” Thêm vào fireFox Sau cài đặt xong chọn vào customize thêm app sqlite Manager kéo vào menu Ok có công cụ sqlite manager!!! Tạo File sqlite : Mở ứng dụng : Chọn vào Database-> New Database-> đặt tên “infor” chọn Ok sau chọn vị trí lưu.! Như tao file thành công Tạo bảng liệu để truy vấn : phải chuột vào Table, chọn create Table Ta xuất hộp thoại sau: Đặt tên cho bảng liệu ” Table Name” : Column Name: Tên trường Data type: Kiểu liệu trường Primary Key: Khoá Autoinc: Tự động tăng Allow Null: không phép Null Unique: Giá trị không phép trùng Bảng đặt tên là: “ThongTin” với trường mẫu ví dụ Đây bảng mẫu truy vấn Sau tạo xong chọn vào Nút OK -> sau nhấn vào YES tạo bảng “ThongTin” thành công Chọn vào table “ThongTin”, chọn menu Browse & search Nhấn vào nút Add để thêm liệu cho bảng: Ở Đây thêm liệu bảng Add thêm liệu nhấn Ok sau chọn YES: liệu tuỳ bạn thêm vào, Ở lấy mẫu liệu bảng => Đầu tiên, có file Sqlite bao gồm bảng:”ThongTin” gồm trường id, Name, Age, liệu mẫu truyền vào Thêm Framework sqlite3, thêm file sqlite vào dự án: Tạo dự án đặt tên “sqlite” Kéo file sqlite vừa tạo vào Project, chọn dấu tick hình vẽ! – Thêm frameWork sqlite: click vào file sqlite-> chọn built phases-> Chọn link binary hình vẽ-> nhấn vào nút + để thêm thư viện hỗ trợ, sau tìm đến sqlite3.tbd nhấn vào Add để thêm framwork Như thêm file sqlite, framework sqlite3.dtb Sau thực xong trông này: Kết nối đến sqlite 3: Chúng ta tạo class chuyên sử lý kết nối đến CSDL, chuẩn truy vấn lấy liệu Vào New file->chọn source-> Chọn Cocoa Touch next, Đặt tên class quản lý “DBManager”, kiểu kế thừa NSObject: sau chọn next ,vị trí lưu! Như tạo class quản lý: Nhiệm vụ khai báo thực thi chuẩn sqlite  Đầu tiên chép file “infor.sql” vào thư mục document thư mục lưu lại file dùng cho tất ứng dụng truy cập, Ta không làm việc trực tiếp với “infor.sql” source code Bởi ta truy vấn liệu file bị thay đổi, ảnh hưởng đến liệu ban đầu truyền vào! Sao chép nào? Để chép phải xác định đường dẫn file file source code, đường dẫn đích thư mục docments Trong DBManager.h: #import @interface DBManager : NSObject// class quản lý vào truy vấn CSDL -(instancetype)initWithDatabaseFilename:(NSString *)dbFilename;// hàm khởi tạo có tham số 6 @end Hàm khởi tạo có tham số: tham số truyền vào tên file Trong file DBManager.m: Ta khai báo thêm biến, đường dẫn đến file documents, tên file sqlite // đường dẫn đến thư mục documents @property (nonatomic, strong) NSString *documentsDirectory; // tên file + đuôi file 10 @property (nonatomic, strong) NSString *databaseFilename; Thực thi hàm khởi tạo có tham số: Mình comment cụ thể dòng lệnh code, Ở thực thi lấy đường dẫn đến thư mục document, tên file, gán vào biến khai báo phía trên: 11 -(instancetype)initWithDatabaseFilename:(NSString *)dbFilename{ self = [super init]; if (self) { // Lấy đường dẫn đến thư mục documents, Kết trả mảng có phần tử! NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 16 // đường dẫn gán vào property documentsDirectory 17 self.documentsDirectory = [paths objectAtIndex:0]; 12 13 14 15 18 19 20 21 22 23 24 25 // Tên file gán vào property databaseFilename self.databaseFilename = dbFilename; // chép file source code vào Thư mục documents [self copyDatabaseIntoDocumentsDirectory]; } return self; 26 } Hàm cho phép chép: Các bạn đọc kỹ phần comment code : 27 -(void)copyDatabaseIntoDocumentsDirectory{ 28 // Lấy đường dẫn cụ thể đến file đích bao gồm đường dẫn documents+ tên file + đuôi file 29 NSString *destinationPath = [self.documentsDirectory stringByAppendingPathComponent:self.databaseFilename]; // Kiểm tra file chưa tồn cho phép chép if (![[NSFileManager defaultManager] fileExistsAtPath:destinationPath]) { NSLog(@"file chưa tồn tại! Thực chép"); // Đường dẫn file source code NSString *sourcePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:self.databaseFilename]; 35 NSError *error;// tạo đối tượng error kiểm tra chép có sinh lỗi không 36 // chép file từ sourcePath -> documents 37 [[NSFileManager defaultManager] copyItemAtPath:sourcePath toPath:destinationPath error:&error]; 30 31 32 33 34 38 39 40 41 42 43 44 45 // Nếu có lỗi chép đưa thông báo! if (error != nil) { NSLog(@"%@", [error localizedDescription]); } }else{// ngược lại file tồn không cần chép cả! NSLog(@"file tồn tại"); } 46 } Như hàm khởi tạo có tham số thực chép file sqlite vào thư mục docments   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ã : // 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ỉ 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 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! 34 // 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 35 // sau chuyển đổi câu truy vấn lưu lại compiledStatement 36 BOOL prepareStatementResult = sqlite3_prepare_v2(sqlite3Database, query, -1, &compiledStatement, NULL); 37 // Nếu câu truy vấn chuyển đổi thành công sang dạng sqlite nhận dạng đc 38 if(prepareStatementResult == SQLITE_OK) { 39 // Kiểm tra truyền vào QueryExecutable NO ta cần trích lọc liệu , đọc liệu 40 if (!queryExecutable){ 41 // Tạo mảng lưu lại thông tin truy vấn! 42 NSMutableArray *arrDataRow; 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 // Thực thi truy vấn cho phép đọc thành công! while(sqlite3_step(compiledStatement) == SQLITE_ROW) { // 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 86 // self.lastInsertedRowID = sqlite3_last_insert_rowid(sqlite3Database); 87 } 88 else { 89 // Lỗi mô tả sqlite 90 NSLog(@"DB Error: %s", sqlite3_errmsg(sqlite3Database)); 91 } 92 } 93 } 94 else { 95 // In the database cannot be opened then show the error message on the debugger 96 // Nếu xảy lỗi mô tả sqlite 97 NSLog(@"%s", sqlite3_errmsg(sqlite3Database)); 98 } 99 100 // Giải phóng truy vấn chuẩn bị 101 sqlite3_finalize(compiledStatement); 102 103 } 104 105 // Đóng lại CSDL 106 sqlite3_close(sqlite3Database); 107 } 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{ 10 11 [self runQuery:[query UTF8String] isQueryExecutable:YES]; 12 } => 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" 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 -(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]]; 10 11 12 13 14 15 16 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]]; 17 } Như hướng dẫn cụ thể sqlite! link full code: http://www.mediafire.com/download/b1efpiyht6ceftp/sqlite+2.zip [...]... NSLog(@"file đã tồn tại"); } 46 } Như vậy trong hàm khởi tạo có tham số chúng ta đã thực hiện sao chép file sqlite vào trong thư mục docments   Mình sẽ giới thiệu cho các bạn khái quát một số hàm trong Sqlite:  sqlite3 _open : Chức năng này được sử dụng để tạo ra và mở một tập tin cơ sở dữ liệu Nếu file không tồn tại nó sẽ tạo ra và sau đó mở file, nếu tồn tại sẽ mở file  sqlite3 _prepare_v2 : Mục đích của... nhận biết bởi SQLite 3  sqlite3 _step : Chức năng này thực sự thực hiện một câu lệnh SQL (query) được chuẩn bị đúng chuẩn sqlite  sqlite3 _column_count : Nó trả về tổng số cột (trường) trong một bảng  sqlite3 _column_text : Phương pháp này trả về nội dung của một Ô trong mẫu giá trị của cột đó , trả về định dạng chuỗi C ( char * )  sqlite3 _column_name : Nó trả về tên của một cột(trường)  sqlite3 _changes... hưởng, sau khi thực hiện một truy vấn  sqlite3 _last_insert_rowid : Nó trả về ID được chèn vào hàng cuối cùng của bảng  sqlite3 _errmsg : Nó trả về lỗi mô tả trong SQLite  sqlite3 _finalize : Nó xóa một câu truy vấn chuẩn bị trước đó  sqlite3 _close : Đóng CLDL DBManager.h 0 @property (nonatomic, strong) NSMutableArray *arrColumnNames;// lưu lại tổng số cột trong một bảng 1 2 @property (nonatomic)... NSLog(@"DB Error: %s", sqlite3 _errmsg (sqlite3 Database)); 91 } 92 } 93 } 94 else { 95 // In the database cannot be opened then show the error message on the debugger 96 // Nếu xảy ra lỗi mô tả sqlite 97 NSLog(@"%s", sqlite3 _errmsg (sqlite3 Database)); 98 } 99 100 // Giải phóng một truy vấn được chuẩn bị 101 sqlite3 _finalize(compiledStatement); 102 103 } 104 105 // Đóng lại CSDL 106 sqlite3 _close (sqlite3 Database);... truyền vào 2 tham số đường dẫn đích đến file định dạng UTF8, Đối tượng sqlite BOOL openDatabaseResult = sqlite3 _open([databasePath UTF8String], &sqlite3 Database); if(openDatabaseResult == SQLITE_ OK) {// nếu mở csdl thành công // Đối tượng lưu trữ các 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 có thể nhận dạng được!... nhận dạng được! 34 // cá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, ở đây -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ủa câu truy vấn Sql 35 // sau khi chuyển đổi câu truy vấn được lưu lại trong compiledStatement 36 BOOL prepareStatementResult = sqlite3 _prepare_v2 (sqlite3 Database, query, -1, &compiledStatement, NULL);... = sqlite3 _step(compiledStatement); if (executeQueryResults == SQLITE_ DONE) {// Nếu truy vấn thành công "chỉ truy vấn không đọc dữ liệu" // // Trả về số lượng hàng bị ảnh hưởng // self.affectedRows = sqlite3 _changes (sqlite3 Database); // // // trả về số đối tượng được chèn vào ở dòng cuối cùng 86 // self.lastInsertedRowID = sqlite3 _last_insert_rowid (sqlite3 Database); 87 } 88 else { 89 // Lỗi mô tả sqlite. .. Ta khai báo thêm 2 biến, đường dẫn đến file documents, và tên file sqlite 7 // đường dẫn đến thư mục documents 8 @property (nonatomic, strong) NSString *documentsDirectory; 9 // tên file + đuôi file 10 @property (nonatomic, strong) NSString *databaseFilename; Thực thi hàm khởi tạo có tham số: Mình đã comment rất cụ thể từng dòng lệnh trong code, Ở đây thực thi lấy đường dẫn đến thư mục document, và tên... chuẩn sqlite  Đầu tiên là sao chép file “infor.sql” vào trong thư mục document đây là thư mục lưu lại các file dùng cho tất cả ứng dụng có thể truy cập, Ta không làm việc trực tiếp với “infor.sql” trong source code Bởi vì khi ta truy vấn dữ liệu trong file bị thay đổi, ảnh hưởng đến dữ liệu ban đầu chúng ta truyền vào! Sao chép như thế nào? Để sao chép được chúng ta phải xác định được đường dẫn file...sau đó tìm đến sqlite3 .tbd nhấn vào Add để thêm framwork Như vậy chúng ta đã thêm được file sqlite, và framework sqlite3 .dtb Sau khi thực hiện xong nó sẽ trông như thế này: Kết nối đến sqlite 3: Chúng ta tạo ra một class chuyên sử lý kết nối đến CSDL, và các chuẩn truy vấn và lấy dữ liệu Vào New file->chọn source-> Chọn

Ngày đăng: 19/10/2016, 00:22

TỪ KHÓA LIÊN QUAN

w