iPhone中支持通過sqlite3來訪問iPhone本地的數據庫。
具體使用方法如下
1:添加開發包libsqlite3.0.dylib
首先是設置項目文件,在項目中添加iPhone版的sqlite3的數據庫的開發包,在項目下的Frameworks點擊右鍵,然後選擇libsqlite3.0.dylib文件。
2,代碼中的操作:
那麼接下來是代碼了。
1 首先獲取iPhone上sqlite3的數據庫文件的地址
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);2 打開iPhone上的sqlite3的數據庫文件
sqlite3 *database;3 准備sql文---sql語句
sqlite3_stmt *stmt;4 邦定參數
// 邦定第一個int參數5 執行sql文
sqlite3_step(stmt);6 釋放sql文資源
sqlite3_finalize(stmt);7 關閉iPhone上的sqlite3的數據庫
sqlite3_close(database);
獲取文件的路徑
- (NSString *)getDataBasePath { NSString* path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; NSString* filePath = [path stringByAppendingPathComponent:@database.db]; // NSString* filePath = [NSHomeDirectory() stringByAppendingPathComponent:@Document/database.db]; return filePath; }
打開數據庫
- (void)openDatabase { //1、獲取文件路徑 NSString* filePath = [self getDataBasePath]; //2、oc字符串--->c字符串 const char * filename = [filePath UTF8String]; //3、打開數據庫 :如果數據庫文件存在直接打開,不存在,系統會在該路徑下創建同名文件. //1‘ 數據庫文件名 c字符串 //2‘ 數據庫對象 sqlite3 **ppDb int rc = sqlite3_open(filename,&_database); //SQLITE_OK 操作成功 //數據庫打開失敗 if (rc != SQLITE_OK) { //關閉數據庫: sqlite3_close(_database); //插入斷言:如果條件表達式的值為NO,程序崩潰,會輸出參數2的值 //1'<#condition#>條件判斷 //2'desc 程序崩潰後輸出的字符串 NSAssert(NO, @數據庫打開失敗,請檢查文件路徑); }else{ NSLog(@數據庫打開成功); } }
數據表創建
- (IBAction)createTable:(id)sender { //1、打開數據庫 [self openDatabase]; //2、創建表的SQL語句: ContactTable NSString* createSql = @CREATE TABLE ContactTable (name TEXT,phone TEXT) ; char* errmsg = nil; //3、執行創建表的sql語句: //1' 數據庫對象 //2' SQL語句 -C字符串 將OC字符串轉換成C字符串 //3' C語言的回調函數:類似於代理方法,NULL //4' 回調函數中的第一個參數: NULL //5' 執行的錯誤信息 int rc = sqlite3_exec(_database, [createSql UTF8String], NULL, NULL, &errmsg); //SQLITE_OK 執行成功 //表的創建失敗 if (rc != SQLITE_OK) { NSLog(@數據表創建失敗); }else{ NSLog(@數據庫表創建成功); } //使用完關閉數據庫 sqlite3_close(_database); }
插入數據
- (IBAction)insertData:(id)sender { //1.打開數據庫 [self openDatabase]; //2.SQL語句:?代表字段內容的占位符,有幾個字段需要幾個? NSString* insertSql = @INSERT INTO ContactTable VALUES(?,?); //准備一個緩沖區 結構體 sqlite3_stmt * stmt = nil; //3、准備插入數據:將sql語句轉化成字節碼,並不執行語句 //1' 數據庫對象 //2' sql語句c字符串 //3' sql語句的長度:strlen函數獲取strlen([insertSql UTF8String],此處一般填寫-1,代表從sql語句的第一個字符 讀取到 第一個終止符;讀取完整地sql語句 //4' 語句的緩沖區 //5' pzTail:如果參數3指定的不是完整地sql語句,此參數會保留剩余的部分;NULL int rc = sqlite3_prepare_v2(_database, [insertSql UTF8String], -1, &stmt, NULL); //如果數據准備完成 :SQLITE_OK if (rc == SQLITE_OK) { //4、將內容綁定到緩存區: //1' 指定的緩存區 //2' 字段索引:從1開始;默認每一條記錄都會添加一個ROWID //3' 字段的值:c字符串 //4' 字符串的長度 //5' 函數指針:NULL NSString* name = @zhangsan; sqlite3_bind_text(stmt, 1, [name UTF8String], strlen([name UTF8String]),NULL); NSString* phone = @電話號碼; sqlite3_bind_text(stmt, 2, [phone UTF8String], strlen([phone UTF8String]), NULL); //5、執行sql語句,如果綁定過程發生錯誤,會將緩存區的內容置空 int rc = sqlite3_step(stmt); //執行插入操作是否成功 //SQLITE_DONE:如果執行成功,表示插入一條記錄執行完畢,沒有下一條記錄 //SQLITE_ROW:執行一條記錄完成,還有下一條記錄 if (rc == SQLITE_DONE) { NSLog(@插入數據成功); }else{ NSLog(@插入數據失敗____%s,sqlite3_errmsg(_database)); } //6、釋放緩存區 : 句柄 sqlite3_finalize(stmt); } //7、關閉數據庫 sqlite3_close(_database); }
刪除數據
- (IBAction)deleteData:(id)sender { //1、打開數據庫 [self openDatabase]; //2、sql語句 NSString* deleteSql = @DELETE FROM ContactTable WHERE name = 'zhangsan'; //3、緩存區 sqlite3_stmt* stmt = NULL; //4、准備sql語句 int rc = sqlite3_prepare_v2(_database, [deleteSql UTF8String], strlen([deleteSql UTF8String]), &stmt, NULL); //5、准備完成, if (rc == SQLITE_OK) { //6、執行sql語句 if (sqlite3_step(stmt) == SQLITE_DONE) { NSLog(@數據刪除完成); } //7、釋放緩存區 sqlite3_finalize(stmt); } //8、關閉數據庫 sqlite3_close(_database); }
修改數據
- (IBAction)upDateData:(id)sender { //1.打開數據庫 [self openDatabase]; //2.SQL語句 // NSString* updateSql = @UPDATE ContactTable SET phone = '18909091234' WHERE name = 'zhangsan'; NSString* updateSql = @UPDATE ContactTable SET phone = '18909091234' WHERE ROWID = 1; //3.緩存區 sqlite3_stmt* stmt = NULL; //4.准備sql int rc = sqlite3_prepare_v2(_database, [updateSql UTF8String], -1, &stmt, NULL); //5.准備完成 if (rc == SQLITE_OK) { //6.執行sql if (sqlite3_step(stmt) == SQLITE_DONE) { NSLog(@數據更新成功); }else{ NSLog(@數據更新失敗); } //7.釋放緩存區 sqlite3_finalize(stmt); } //8.關閉數據庫 sqlite3_close(_database); }
查詢
- (IBAction)queryData:(id)sender { //裝取出的每一條記錄 NSMutableArray* mArray = [NSMutableArray array]; //1.打開數據庫 [self openDatabase]; //2.sql語句 NSString* querySql = @SELECT * FROM ContactTable; //3.准備一個緩存區 sqlite3_stmt* stmt = NULL; //4.准備讀取數據: int rc = sqlite3_prepare_v2(_database, [querySql UTF8String], -1, &stmt, NULL); //5.准備完成 if (rc == SQLITE_OK) { //6.執行sql:如果有多條數據,或者不知道數據庫中有多少行數據,使用while循環執行 //如果執行完畢,返回SQLITE_DONE,不再走while語句;如果還有下一條數據,返回SQLITE_ROW,繼續進入while循環 while (sqlite3_step(stmt) == SQLITE_ROW) { //7.從緩存區取數據: //1' 緩存區 //2' 字段索引: 從0開始 char* name = (char *)sqlite3_column_text(stmt, 0); char * phone =(char *)sqlite3_column_text(stmt, 1); //將C字符串--->OC字符串 NSString* nameStr = [[NSString alloc] initWithUTF8String:name]; // [NSString stringWithUTF8String:name]; NSString* phoneStr = [[NSString alloc] initWithUTF8String:phone]; //每條記錄都有電話和姓名:放在數組中,一個數據代表一條記錄 [mArray addObject:nameStr]; [mArray addObject:phoneStr]; } //釋放緩存區:寫在while循環外 sqlite3_finalize(stmt); } for (id object in mArray) { NSLog(@取出的數據為____%@,object); } //關閉數據庫 sqlite3_close(_database); }