本篇部落格就使用前面操作SQLite的知識來實現如何去插入,刪除和更新資料。然後再把操作SQlite資料庫常用的方法進行一個封裝。把常用方法進行封裝後,把Cars資料庫中的其中一個表的資料進行查詢,並在UITableView上進行展示。因為本例項要對資料庫的資料進行modify(修改)操作 ,在iOS系統上呢,為了安全起見,在Bundle中的資料庫資源是不允許進行資料的插入修改和刪除操作的。在之前的部落格中我們只進行了查詢操作,所以從Bundle載入資料庫資原始檔是可行的。
如果對資料庫程式insert, update, delete等操作,那麼需要在開啟資料庫之前把Bundle中的資料庫拷貝到沙盒中(每個App都有自己的沙盒,在沒有越獄的機器上,App只可以訪問自己的沙盒,這也是iOS比較安全的地方之一)。今天這篇部落格會封裝出一個操作SQLite資料庫的工具類,並且呼叫這個工具類對資料庫進行增刪改查,實現一個小的例項。廢話少說,直奔主題。
一、資料庫操作工具類
為了運算元據庫更為方便,對資料庫操作:開啟關閉資料庫,無繫結值查詢資料庫,有繫結值查詢資料庫,插入資料,刪除資料,更新資料等進行了簡單的封裝。當然有感興趣的小夥伴可以繼續完善,比如加上事務操作等。
工具類對外介面介紹
先來看一下封裝的工具類對外的介面,然後介紹一下其使用方法。介面程式碼具體如下所示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 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 |
// // OperationSqliteTools.h // SettingBundleDemo // // Created by Mr.LuDashi on 15/8/31. // Copyright (c) 2015年 zeluli. All rights reserved. // #import 10 #import 11 @interface OperationSqliteTools : NSObject /******************************* *功能:開啟資料庫 *引數:databaseName -- 資料庫名稱 *返回:資料庫物件(sqlite3物件) *******************************/ + (sqlite3 *) openDatabaseWithName: (NSString *)databaseName; /******************************* *功能:關閉資料庫 *引數:database -- sqlite3 物件 *返回:空 *******************************/ + (void) closeDatabaseWithName: (sqlite3 *)database; /******************************* *功能:查詢資料,無繫結變數 *引數:database -- sqlite3 物件, SQL:要執行的SQL查詢語句 *返回:封裝成陣列的查詢資料 *******************************/ + (NSArray *) queryInfoWithDataBase: (sqlite3 *) database WithSQL: (NSString *) SQL; /******************************* *功能:查詢資料,有繫結變數 *引數:database -- sqlite3 物件, SQL:要執行的SQL查詢語句,parameter:繫結變數的值 *返回:封裝成陣列的查詢資料 *******************************/ + (NSArray *) queryInfoWithDataBase: (sqlite3 *) database WithSQL: (NSString *) SQL WithParameter: (NSArray *)parameter; /******************************* *功能:插入資料 *引數:database -- sqlite3 物件, SQL:要執行的SQL插入語句,parameter:繫結變數的值 *返回:插入結果,YES:插入成功, NO:插入失敗 *******************************/ + (BOOL) insertDataWithDataBase: (sqlite3 *) database WithSQL: (NSString *) SQL WithParameter: (NSArray *)parameter; /******************************* *功能:更新資料 *引數:database -- sqlite3 物件, SQL:要執行的SQL插入語句,parameter:繫結變數的值 *返回:插入結果,YES:更新成功, NO:更新失敗 *******************************/ + (BOOL) updateDataWithDataBase: (sqlite3 *) database WithSQL: (NSString *) SQL WithParameter: (NSArray *)parameter; /******************************* *功能:刪除資料 *引數:database -- sqlite3 物件, SQL:要執行的SQL插入語句,parameter:繫結變數的值 *返回:插入結果,YES:刪除成功, NO:刪除失敗 *******************************/ + (BOOL) deleteDataWithDataBase: (sqlite3 *) database WithSQL: (NSString *) SQL WithParameter: (NSArray *)parameter; /******************************* *功能:列印出查詢後的結果 *引數:array -- 結果陣列 *返回:空 *******************************/ + (void) displayResultWithArray: (NSArray *) array; @end |
二、 介面的具體介紹
1、開啟資料庫
下面的介面是開啟資料庫功能,把資料庫的名字傳入如(Cars.sqlite),返回的是一個sqlite3的物件,你可以通過這個物件來對開啟的資料庫進行操作。在這個方法中,先去沙盒中檢視是否有該資料庫,如果有就直接開啟。如果沒有就從Bundle中把資料庫資源複製到沙盒中,然後再從沙盒中開啟。你要知道在Bundle中是無法去更改資料庫中的資料的。下方是對外暴漏的介面。
1 2 3 4 5 6 |
/******************************* *功能:開啟資料庫 *引數:databaseName -- 資料庫名稱 *返回:資料庫物件(sqlite3物件) *******************************/ + (sqlite3 *) openDatabaseWithName: (NSString *)databaseName; |
該介面實現的具體方法如下,在關鍵程式碼出都加了註釋,閱讀程式碼時可以看一下注釋,對於程式碼的東西就不做過多的贅述了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
/******************************* *功能:開啟資料庫 *引數:databaseName -- 資料庫名稱 *返回:資料庫物件(sqlite3物件) *******************************/ + (sqlite3 *) openDatabaseWithName: (NSString *)databaseName{ //將資料庫檔案複製到沙盒中 NSFileManager *fileManager = [NSFileManager defaultManager]; //獲取沙盒路徑 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentDirectory = paths[0]; //拼接出資料庫檔案在沙盒中的路徑 NSString *sqlPath = [documentDirectory stringByAppendingPathComponent:databaseName]; //判斷沙盒中是否已經存在我們要開啟的資料庫檔案 BOOL success = [fileManager fileExistsAtPath:sqlPath]; //不存在的情況,會從Bundle中把資源複製過去 if (!success) { NSString *defautlDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName]; NSError *error = nil; success = [fileManager copyItemAtPath:defautlDBPath toPath:sqlPath error:&error]; if (!success) { NSLog(@"%@", [error localizedDescription]); } } //把路徑轉成C字串 const char * filePath = [sqlPath UTF8String]; //宣告sqlite3物件 sqlite3 * database = nil; //開啟資料庫 int result = sqlite3_open_v2(filePath, &database, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); //成功開啟 if (result == SQLITE_OK) { return database; } return nil; } |
2.關閉資料庫
關閉資料庫就比較簡單了,直接把傳入的sqlite3物件進行一個關閉即可,具體程式碼如下:
1 2 3 4 5 6 7 8 |
/******************************* *功能:關閉資料庫 *引數:database -- sqlite3 物件 *返回:空 *******************************/ + (void) closeDatabaseWithName: (sqlite3 *)database{ sqlite3_close(database); } |
3. 程式碼好多,部落格篇幅有限,就不一一的去往上貼上程式碼了,具體程式碼實現回在GitHub上進行分享,gitHub連線請看本部落格的末尾處,在程式碼中也是在關鍵部分新增了相應的註釋。
三、例項實現
呼叫上述簡單封裝的方法實現例項,對Cars.sqlite資料中其中一個表進行操作。先讀取資料庫中的資料,在TableView上進行載入,然後可以對資料進行新增和刪除操作,更新操作就不做演示了。在插入操作中有如果有這條資料就進行Replace,這變相是一個update操作。
下方是Demo的執行效果,為了體現資料插入和刪除的變化效果,給我們的Cell新增了一個動畫效果,便於觀察資料的變化。這個Demo也會在Github上進行分享,你可以自己執行去看一下效果。下方是動態的執行效果。為了簡化操作,點選加號會有預先設定好的資料進行插入(當然你可以把使用者輸入的資料進行一個新增),刪除的話就是TableView自帶的效果刪除。
下方Demo的實現並沒有什麼困難之處,就是對TableView的簡單操作,如果你感興趣的話,可以從Github上進行clone,然後進行擴充套件,新增上搜尋,更新等功能。關於CoreData的操作就要看之前的部落格《iOS開發之表檢視愛上CoreData》.
gitHub分享地址:https://github.com/lizelu/SQLiteResource
打賞支援我寫出更多好文章,謝謝!
打賞作者
打賞支援我寫出更多好文章,謝謝!