SQLite (http://www.sqlite.org/docs.html) 是一個輕量級的關(guān)系數(shù)據(jù)庫。SQLite最初的設計目標是用于嵌入式系統(tǒng),它占用資源非常少,在嵌入式設備中,只需要幾百K的內(nèi)存就夠了,目前應用于Android、iOS、Windows Phone等智能手機。iOS 使用時SQLite,只需要加入 libsqlite3.dylib 依賴以及引入 sqlite3.h 頭文件即可。
在這里我還是要推薦下我自己建的iOS開發(fā)學習群:680565220,群里都是學ios開發(fā)的,如果你正在學習ios ,小編歡迎你加入,今天分享的這個案例已經(jīng)上傳到群文件,大家都是軟件開發(fā)黨,不定期分享干貨(只有iOS軟件開發(fā)相關(guān)的),包括我自己整理的一份2018最新的iOS進階資料和高級開發(fā)教程
? ? ? ? ? 數(shù)據(jù)庫操作包含打開數(shù)據(jù)庫、創(chuàng)建表,表的增、刪、改、查。下面代碼給出了數(shù)據(jù)庫操作。
? ? ? ? ?創(chuàng)建并打開數(shù)據(jù)庫:
[cpp]?view plain?copy
-(BOOL)?openDB{??
//獲取數(shù)據(jù)庫路徑??
????NSArray?*paths?=?NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,?NSUserDomainMask,?YES);??
????NSString?*documents?=?[paths?objectAtIndex:0];??
????NSString?*database_path?=?[documents?stringByAppendingPathComponent:DBNAME];??
//如果數(shù)據(jù)庫存在,則用sqlite3_open直接打開(不要擔心,如果數(shù)據(jù)庫不存在sqlite3_open會自動創(chuàng)建)??
//打開數(shù)據(jù)庫,這里的[path?UTF8String]是將NSString轉(zhuǎn)換為C字符串,因為SQLite3是采用可移植的C(而不是??
//Objective-C)編寫的,它不知道什么是NSString.??
if?(sqlite3_open([database_path?UTF8String],?&db)?==?SQLITE_OK)?{??
return?YES;??
}else{??
return?NO;??
NSLog(@"數(shù)據(jù)庫打開失敗");??
????????sqlite3_close(db);??
????}??
}??
? ? ? ? ?iOS中沒有提供創(chuàng)建數(shù)據(jù)庫的命令,當使用sqlite3_open時,如果數(shù)據(jù)庫文件不存在會自行創(chuàng)建數(shù)據(jù)庫,如果存在會打開數(shù)據(jù)庫。打開數(shù)據(jù)庫后就可以創(chuàng)建表并操作表內(nèi)容了,iOS中的sqlite3使用sqlite3_exec來創(chuàng)建表、插入表內(nèi)容、修改表內(nèi)容、刪除表內(nèi)容等操作,使用sqlite3_prepare_v2來查詢表。下面給給出了sqlite3_exec的封裝:
[cpp]?view plain?copy
-(void)execSql:(NSString?*)sql??
{??????
if?([self?openDB])?{??
char?*err;??
if?(sqlite3_exec(db,?[sql?UTF8String],?NULL,?NULL,?&err)?!=?SQLITE_OK)?{??
NSLog(@"數(shù)據(jù)庫操作數(shù)據(jù)失敗!");??
}else{??
NSLog(@"%@",sql);??
????????}??
????????sqlite3_close(db);??
????}??????
}??
? ? ? ? 創(chuàng)建表:
[cpp]?view plain?copy
NSString?*sqlCreateTable?=??[NSString?stringWithFormat:@"CREATE?TABLE?IF?NOT?EXISTS?'%@'?('%@'?INTEGER?PRIMARY?KEY?AUTOINCREMENT,?'%@'?TEXT,?'%@'?INTEGER,?'%@'?TEXT)",TABLENAME,ID,NAME,AGE,ADDRESS];??
????[self?execSql:sqlCreateTable];??
? ? ? ? 插入數(shù)據(jù):
[cpp]?view plain?copy
-(void)?insertData{??
????NSString?*insertSql1=?[NSString?stringWithFormat:??
@"INSERT?INTO?'%@'?('%@',?'%@',?'%@')?VALUES?('%@',?'%@',?'%@')",??
TABLENAME,?NAME,?AGE,?ADDRESS,?@"張三",?@"13",?@"濟南"];??
????[self?execSql:insertSql1];??
????NSString?*insertSql2?=?[NSString?stringWithFormat:??
@"INSERT?INTO?'%@'?('%@',?'%@',?'%@')?VALUES?('%@',?'%@',?'%@')",??
TABLENAME,?NAME,?AGE,?ADDRESS,?@"李四",?@"12",?@"濟南"];??
????[self?execSql:insertSql2];??
}??
? ? ? ? ?修改表:
[cpp]?view plain?copy
-(void)?updateData{??
????NSString?*updateSql?=?[NSString?stringWithFormat:??
@"UPDATE?'%@'?SET?'%@'?=?'%@'?WHERE?'%@'?=?'%@'",??
TABLENAME,???AGE,??@"15"?,AGE,??@"13"];??
????[self?execSql:updateSql];??
}??
? ? ? ? ?刪除表內(nèi)容:
[cpp]?view plain?copy
-(void)?deleteData{??
????NSString?*sdeleteSql?=?[NSString?stringWithFormat:??
@"delete?from?%@?where?%@?=?'%@'",??
TABLENAME,?NAME,?@"張三"];??
????[self?execSql:sdeleteSql];??
}??
上面實現(xiàn)了表內(nèi)容的增、改、刪,下面實現(xiàn)表內(nèi)容查詢。
[cpp]?view plain?copy
-(void)?selectData{??
????[self?openDB];??
????NSString?*sqlQuery?=?[NSString?stringWithFormat:??
@"SELECT?*?FROM?%@",TABLENAME];??
????sqlite3_stmt?*?statement;??
if?(sqlite3_prepare_v2(db,?[sqlQuery?UTF8String],?-1,?&statement,?nil)?==?SQLITE_OK)?{??
//查詢結(jié)果集中一條一條的遍歷所有的記錄,這里的數(shù)字對應的是列值,注意這里的列值??
while?(sqlite3_step(statement)?==?SQLITE_ROW)?{??
char?*name?=?(char*)sqlite3_column_text(statement,?1);??
????????????NSString?*nsNameStr?=?[[NSString?alloc]initWithUTF8String:name];??
int?age?=?sqlite3_column_int(statement,?2);??
char?*address?=?(char*)sqlite3_column_text(statement,?3);??
????????????NSString?*nsAddressStr?=?[[NSString?alloc]initWithUTF8String:address];??
NSLog(@"name:%@??age:%d??address:%@",nsNameStr,age,?nsAddressStr);??
????????}??
}else{??
NSLog(@"select?error:%@",sqlQuery);??
????}??
????sqlite3_close(db);??
}??
好了,這就是全部了,iOS中數(shù)據(jù)庫操作的類封裝的并不太好用,希望大家盡量封裝自己的類,。