標籤:sqlite fmdb 資料庫 ios sqlite3
iOS中的SQLite與Android中的一模一樣,只是調用方法有差異。如果單從調用來講,Android封裝的一套helper更好用一些,而iOS原生的用C語言的幾個函數在操作,比較麻煩。不過引入第三方架構FMDB,使用起來就方便很多。
一、SQLite的基本使用
使用步驟:
1.匯入系統架構(C語言). (libsqlite3)2.標頭檔#import<sqlite3.h>.3. sqlite3_open(fileName.UTF8String, &_db); 開啟或者建立一個資料*_db自己定義一個sqlite3的成員變數.進行正刪改查時要用.4.sqlite3_exec(_db, sql, NULL, NULL,&error);*該函數可進行insert,delete,update操作.5.查詢操作select.*sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL);做查詢前準備,檢測SQL語句是否正確.*sqlite3_step(stmt) 提取查詢到的資料,一次提取一條.*sqlite3_column_text(stmt, 0)取出第0列的資料.
直接看代碼更易懂:建立或開啟資料庫:
// 0.擷取檔案地址 NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]; NSString *fileName = [path stringByAppendingPathComponent:@"t_student.sqlite"]; // 1.開啟或者建立一個資料庫 // (1.如果資料庫不存在就會自動建立資料庫並開啟, 2.如果資料庫儲存就會自動開啟資料庫) int result = sqlite3_open(fileName.UTF8String, &_db); if (result == SQLITE_OK) { NSLog(@"開啟資料庫成功"); // 2.建立表 /** sqlite3 傳遞已經開啟的資料庫 sql: 需要執行的資料庫語句 */ const char *sql = "CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER NOT NULL);"; char *error = nil; // 在db資料庫中執行sql語句 sqlite3_exec(self.db, sql, NULL, NULL, &error); if (error) { NSLog(@"建立表失敗"); }else { NSLog(@"建立表成功"); } }else { NSLog(@"開啟資料庫失敗"); }
插入資料:(更新,刪除與此類似)
// 1.拼接插入sql語句 NSString *name = [NSString stringWithFormat:@"Jonathan-%d", i]; int age = arc4random_uniform(100); NSString *sql = [NSString stringWithFormat:@"INSERT INTO t_student(name, age) VALUES ('%@', %d);", name, age]; char *error = nil; // 2.執行插入sql語句 sqlite3_exec(self.db, sql.UTF8String, NULL, NULL, &error); if (error) { NSLog(@"添加失敗"); }else { NSLog(@"添加成功"); }
查詢資料:
const char *sql = "SELECT name, age FROM t_student;";// char *error = nil;// sqlite3_exec(self.db, sql, NULL, NULL, &error); sqlite3_stmt *stmt; // 用於提取資料的 // 1.做查詢前的準備, 檢查sql語句是否正確 int result = sqlite3_prepare_v2(self.db, sql, -1, &stmt, NULL); if (result == SQLITE_OK) {// 準備完成, 沒有錯誤 // 2.提取查詢到的資料到stmt, 一次提取一條 // 如果傳回值為SQLITE_ROW, 就代表提取到了一條記錄 while(sqlite3_step(stmt) == SQLITE_ROW) { // 3.取出提取到的記錄(資料)中的第0列的資料 const unsigned char *name = sqlite3_column_text(stmt, 0); int age = sqlite3_column_int(stmt, 1); NSLog(@"%s %d", name, age); } }
二、FMDB的使用FMDB的好處是對基本C庫的封裝,方便使用。同時還提供了多線程操作資料庫帶來的讀髒資料等問題的方法。
架構地址:https://github.com/ccgus/fmdb
使用:(需要FMDatabase *db成員變數)建立或開啟:
// 0.擷取沙箱路徑 NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]; NSString *fileName = [path stringByAppendingPathComponent:@"t_student.sqlite"]; // 1.獲得資料庫物件 self.db = [FMDatabase databaseWithPath:fileName]; // 2.開啟資料庫 if ([self.db open]) { NSLog(@"開啟成功"); // 2.1建立表 BOOL success = [self.db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name TEXT NOT NULL, age INTEGER NOT NULL);"]; if (success) { NSLog(@"建立表成功"); }else { NSLog(@"建立表失敗"); } }else { NSLog(@"開啟失敗"); }
插入操作:(更新,刪除與此類似)
BOOL success = [self.db executeUpdate:@"INSERT INTO t_student(name , age) VALUES(?, ?);", @"xuneng", @(10)];// 注意只能拼接物件類型 if (success) { NSLog(@"添加成功"); }else { NSLog(@"添加失敗"); }
查詢:
// 1.查詢 FMResultSet *set = [self.db executeQuery:@"SELECT * FROM t_student;"]; // 2.取出資料 while ([set next]) { // 取出姓名// NSString *name = [set stringForColumnIndex:1]; // 取出年齡// int age = [set intForColumnIndex:2]; NSString *name = [set stringForColumn:@"name"]; int age = [set intForColumn:@"age"]; NSLog(@"name = %@, age = %d", name, age); }
FMDB還能定義操作隊列
FMDatabaseQueue,這個隊列是安全執行緒的。(FMDatabase不是安全執行緒的)
同時還能開啟
事物、提交事物。使用相當方便。
可參照https://github.com/ccgus/fmdb上進行學習,寫的相當詳細。
轉載請註明出處:http://blog.csdn.net/xn4545945
【iOS】使用SQLite與FMDB