實際開發中,掌握並熟練使用SQLite數據庫對app內數據進行操作是移動開發人員至關重要的技能,iOS中封裝的coreData固然也是對SQLite的二層封裝,強大的https://github.com/ccgus/fmdb‘>FMDB也會幫程序員減輕很多不必要的麻煩,提高工作效率,既然是封裝.性能自然不如直接操作SQL語句
設置類方法創建單例對象-OC中創建單例可以單獨生成類方法創建單例對象,也可使用原始init方法創建普通對象
.h @interface SQLiteManager : NSObject //類方法生成單例對象 +(instancetype)shareInstance; @end .m @implementation SQLiteManager static SQLiteManager *instance; +(instancetype)shareInstance{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[self alloc] init]; }); return instance; } @end
首先需要在項目中導入libsqlite3.tbd框架
然後在SQLiteManager數據庫管理類引入頭文件
#import
在.h文件中暴露打開數據庫的接口
//打開數據庫 -(BOOL)openDB;
.m文件中輕松加愉快的實現使用原生SQLite框架的各種操作數據庫的方法.
SQL語句建議直接復制粘貼備忘錄中的語句,以免拼寫出錯(有可能是博客中最沒用的一句話)
#pragma mark - 打開/創建數據庫 -(BOOL)openDB{ //app內數據庫文件存放路徑-一般存放在沙盒中 NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *DBPath = [documentPath stringByAppendingPathComponent:@"appDB.sqlite"]; //創建(指定路徑不存在數據庫文件)/打開(已存在數據庫文件) 數據庫文件 //sqlite3_open(<#const char *filename#>, <#sqlite3 **ppDb#>) filename:數據庫路徑 ppDb:數據庫對象 if (sqlite3_open(DBPath.UTF8String, &_db) != SQLITE_OK) { //數據庫打開失敗 return NO; }else{ //打開成功創建表 return [self creatTable]; } } -(BOOL)creatTable{ //創建表的SQL語句 //用戶 表 NSString *creatUserTable = @"CREATE TABLE IF NOT EXISTS 't_User' ( 'ID' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,'name' TEXT,'age' INTEGER,'icon' TEXT);"; //車 表 NSString *creatCarTable = @"CREATE TABLE IF NOT EXISTS 't_Car' ('ID' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,'type' TEXT,'output' REAL,'master' TEXT)"; //項目中一般不會只有一個表 NSArray *SQL_ARR = [NSArray arrayWithObjects:creatUserTable,creatCarTable, nil]; return [self creatTableExecSQL:SQL_ARR]; } -(BOOL)creatTableExecSQL:(NSArray *)SQL_ARR{ for (NSString *SQL in SQL_ARR) { //參數一:數據庫對象 參數二:需要執行的SQL語句 其余參數不需要處理 if (![self execSQL:SQL]) { return NO; } } return YES; } #pragma 執行SQL語句 -(BOOL)execSQL:(NSString *)SQL{ return sqlite3_exec(self.db, SQL.UTF8String, nil, nil, nil) == SQLITE_OK; }
#pragma 執行SQL語句 -(BOOL)execSQL:(NSString *)SQL{ return sqlite3_exec(self.db, SQL.UTF8String, nil, nil, nil) == SQLITE_OK; }
如果需要更新數據庫對應表中數據,直接調用SQL執行方法即可實現
-(void)updateIcon{ //更新對應的SQL語句 NSString *SQL = [NSString stringWithFormat:@"UPDATE 't_User' SET icon='%@' WHERE name = '%@'",@"http://qiuxuewei.com/newIcon.png",@"name_6"]; if ([[SQLiteManager shareInstance] execSQL:SQL]) { NSLog(@"對應數據修改成功"); } }
項目中的Model自定義對象可以自定義一個將自身插入數據庫的方法
-(BOOL)insertSelfToDB{
//插入對象的SQL語句
NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO 't_User' (name,age,icon) VALUES ('%@',%ld,'%@');",self.name,self.age,self.icon];
return [[SQLiteManager shareInstance] execSQL:insertSQL];
}
查詢數據庫中對應表中所有數據
#pragma mark - 查詢數據庫中數據
-(NSArray *)querySQL:(NSString *)SQL{
//准備查詢
// 1> 參數一:數據庫對象
// 2> 參數二:查詢語句
// 3> 參數三:查詢語句的長度:-1
// 4> 參數四:句柄(游標對象)
// sqlite3_prepare_v2(<#sqlite3 *db#>, <#const char *zSql#>, <#int nByte#>, <#sqlite3_stmt **ppStmt#>, <#const char **pzTail#>)
sqlite3_stmt *stmt = nil;
if (sqlite3_prepare_v2(self.db, SQL.UTF8String, -1, &stmt, nil) != SQLITE_OK) {
NSLog(@"准備查詢失敗!");
return NULL;
}
//准備成功,開始查詢數據
//定義一個存放數據字典的可變數組
NSMutableArray *dictArrM = [[NSMutableArray alloc] init];
while (sqlite3_step(stmt) == SQLITE_ROW) {
//一共獲取表中所有列數(字段數)
int columnCount = sqlite3_column_count(stmt);
//定義存放字段數據的字典
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
for (int i = 0; i < columnCount; i++) {
// 取出i位置列的字段名,作為字典的鍵key
const char *cKey = sqlite3_column_name(stmt, i);
NSString *key = [NSString stringWithUTF8String:cKey];
//取出i位置存儲的值,作為字典的值value
const char *cValue = (const char *)sqlite3_column_text(stmt, i);
NSString *value = [NSString stringWithUTF8String:cValue];
//將此行數據 中此字段中key和value包裝成 字典
[dict setObject:value forKey:key];
}
[dictArrM addObject:dict];
}
return dictArrM;
}
在自定義模型中有必要定義個工廠方法可將數據庫對應表中所有數據取出,以模型數組的形式輸出
+(NSArray *)allUserFromDB{
//查詢表中所有數據的SQL語句
NSString *SQL = @"SELECT name,age,icon FROM 't_User'";
//取出數據庫用戶表中所有數據
NSArray *allUserDictArr = [[SQLiteManager shareInstance] querySQL:SQL];
NSLog(@"%@",allUserDictArr);
//將字典數組轉化為模型數組
NSMutableArray *modelArrM = [[NSMutableArray alloc] init];
for (NSDictionary *dict in allUserDictArr) {
[modelArrM addObject:[[User alloc] initWithDict:dict]];
}
return modelArrM;
}
當然,github已經上傳源代碼:https://github.com/qxuewei/Swift-test/tree/master/SQLite%E6%95%B0%E6%8D%AE%E5%BA%93%E6%93%8D%E4%BD%9C-0C