學(xué)習(xí)SQLite不是本文的目的,所以關(guān)于SQLite的學(xué)習(xí),請(qǐng)查找其他資料,本文的重點(diǎn)是iOS上使用SQLite入門
1.介紹
什么是SQLite
SQLite是一種嵌入式的關(guān)系型數(shù)據(jù)庫(kù),大多數(shù)關(guān)系型服務(wù)器都是運(yùn)行于一個(gè)獨(dú)立的服務(wù)器,但是SQLite卻無(wú)需獨(dú)立服務(wù)器,而是以C語(yǔ)言庫(kù)的形式存在,并且代碼量非常的小。所以集成的成本非常的低。
還有另外一個(gè)好處,SQLite是開源并且免費(fèi)的~
關(guān)于SQL
SQL是Structured Query Language(結(jié)構(gòu)化請(qǐng)求語(yǔ)句)的意思,大多數(shù)關(guān)系型數(shù)據(jù)庫(kù),都是用SQL語(yǔ)言操作數(shù)據(jù)庫(kù)。
2.SQL代碼講解
假設(shè)你的電腦里已經(jīng)安裝了SQLite,尤其是Mac,是預(yù)裝的。
打開/創(chuàng)建數(shù)據(jù)庫(kù)文件
ns:Desktop Realank$ sqlite3 ./mydatabase.sqlite
SQLite version 3.8.10.2 2015-05-20 18:17:19
Enter ".help" for usage hints.
sqlite>
打開數(shù)據(jù)庫(kù)以后,需要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)表(table),用來(lái)表格化存儲(chǔ)數(shù)據(jù)。
創(chuàng)建表的時(shí)候,需要指定表包含的元素,和各個(gè)元素的類型:
sqlite> CREATE TABLE CONTACTS (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, ADDRESS TEXT, PHONE TEXT);
然后就是熟悉的增刪改查
增加一行數(shù)據(jù):
INSERT INTO CONTACTS (NAME, ADDRESS, PHONE) VALUES ("zhang","Nanjing Road","18612345678");
刪除一行數(shù)據(jù):
DELETE FROM CONTACTS WHERE NAME = "wang";
修改一行數(shù)據(jù):
UPDATE CONTACTS SET NAME = "wang" WHERE NAME = "zhang";
查詢語(yǔ)句:
SELECT * FROM CONTACTS;
3.iOS使用SQLite語(yǔ)句
導(dǎo)入sqlite3庫(kù)
iOS可以導(dǎo)入蘋果提供好的sqlite3庫(kù),在項(xiàng)目設(shè)置中添加即可

然后在項(xiàng)目中導(dǎo)入頭文件:
#import <sqlite3.h>
選擇存放數(shù)據(jù)庫(kù)文件的位置
我們決定將文件存儲(chǔ)在沙盒的Cache目錄下
什么是沙盒,以及怎么打開沙盒,請(qǐng)看這里
我們生成數(shù)據(jù)庫(kù)文件的路徑
NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
NSString *databasePath = [cachePath stringByAppendingPathComponent:@"contacts.sqlite"];
打開數(shù)據(jù)庫(kù)
如果數(shù)據(jù)庫(kù)文件不存在,則創(chuàng)建文件
sqlite3 *contactDB; //Declare a pointer to sqlite database structure
const char *dbpath = [databasePath UTF8String]; // Convert NSString to UTF-8
//打開數(shù)據(jù)庫(kù)文件,沒有則創(chuàng)建
if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK) {
NSLog(@"數(shù)據(jù)庫(kù)打開成功");
} else {
NSLog(@"數(shù)據(jù)庫(kù)打開失敗");
}
創(chuàng)建數(shù)據(jù)表
char sql_stmt[1000];
//創(chuàng)建表
snprintf(sql_stmt, sizeof(sql_stmt)/sizeof(char),"CREATE TABLE IF NOT EXISTS CONTACTS (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, ADDRESS TEXT, PHONE TEXT)");
if (sqlite3_exec(contactDB, sql_stmt, NULL, NULL, NULL) == SQLITE_OK)
{
NSLog(@"成功創(chuàng)建表");
}
增刪改查
sqlite3_stmt *statement;
//---增---
snprintf(sql_stmt, sizeof(sql_stmt)/sizeof(char), "INSERT INTO CONTACTS (NAME, ADDRESS, PHONE) VALUES (\"zhang\",\"Nanjing Road\",\"18612345678\")");
if (sqlite3_exec(contactDB, sql_stmt, NULL, NULL, NULL) == SQLITE_OK)
{
NSLog(@"成功增加一行");
}
//---刪---
snprintf(sql_stmt, sizeof(sql_stmt)/sizeof(char), "DELETE FROM CONTACTS WHERE NAME = \"wang\"");
if (sqlite3_exec(contactDB, sql_stmt, NULL, NULL, NULL) == SQLITE_OK)
{
NSLog(@"成功刪除一行");
}
//---改---
snprintf(sql_stmt, sizeof(sql_stmt)/sizeof(char), "UPDATE CONTACTS SET NAME = \"wang\" WHERE NAME = \"zhang\"");
if (sqlite3_exec(contactDB, sql_stmt, NULL, NULL, NULL) == SQLITE_OK)
{
NSLog(@"成功修改一行");
}
//---查---
snprintf(sql_stmt, sizeof(sql_stmt)/sizeof(char), "SELECT id, NAME, ADDRESS FROM CONTACTS");
//準(zhǔn)備一個(gè)SQL語(yǔ)句,用于執(zhí)行
sqlite3_prepare_v2(contactDB, sql_stmt, -1, &statement, NULL);
//執(zhí)行一條準(zhǔn)備的語(yǔ)句,如果找到一行匹配的數(shù)據(jù),則返回SQLITE_ROW
while (sqlite3_step(statement) == SQLITE_ROW) {
//獲取執(zhí)行的結(jié)果中,某一列的數(shù)據(jù),并指定獲取的類型(int, text...),如果內(nèi)部類型和獲取的類型不一致,方法內(nèi)部將會(huì)對(duì)內(nèi)容進(jìn)行類型轉(zhuǎn)換
NSInteger index = sqlite3_column_int(statement, 0);
NSString *nameField = [[NSString alloc] initWithUTF8String: (const char *) sqlite3_column_text(statement, 1)];
NSString *addressField = [[NSString alloc] initWithUTF8String: (const char *) sqlite3_column_text(statement, 2)];
NSLog(@"%ld %@ %@",(long)index,nameField,addressField);
}
sqlite3_finalize(statement);//在內(nèi)存中,清除之前準(zhǔn)備的語(yǔ)句
關(guān)閉數(shù)據(jù)庫(kù)
sqlite3_close(contactDB);//關(guān)閉數(shù)據(jù)庫(kù)
4.iOS sqlite3庫(kù)主要API講解
-
sqlite3_open()- 打開對(duì)應(yīng)的數(shù)據(jù)庫(kù)文件,如果文件不存在,則創(chuàng)建 -
sqlite3_close()- 關(guān)閉之前打開的數(shù)據(jù)庫(kù) -
sqlite3_prepare_v2()- 準(zhǔn)備一條SQL語(yǔ)句,用于執(zhí)行(SQL語(yǔ)句需要先準(zhǔn)備,之后再step執(zhí)行) -
sqlite3_step()- 執(zhí)行一條準(zhǔn)備好的語(yǔ)句 -
sqlite3_column_<type>()- 獲取執(zhí)行的結(jié)果中,某一列的數(shù)據(jù),并指定獲取的類型(int, text...),如果內(nèi)部類型和獲取的類型不一致,方法內(nèi)部將會(huì)對(duì)內(nèi)容進(jìn)行類型轉(zhuǎn)換 -
sqlite3_finalize()- 從內(nèi)存中刪除之前準(zhǔn)備好的語(yǔ)句,每一條準(zhǔn)備好的語(yǔ)句,都需要?jiǎng)h除,否則會(huì)資源泄漏 -
sqlite3_exec()- 集成了sqlite3_prepare_v2(), sqlite3_step(), sqlite3_finalize()到一條語(yǔ)句
5. GitHub
整個(gè)數(shù)據(jù)持久化操作的Demo代碼,都存儲(chǔ)在GitHub中
其中SQLite操作的內(nèi)容,在RACSQLiteDemo類中