iOS數(shù)據(jù)持久化(4)-SQLite

學(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講解

  1. sqlite3_open() - 打開對(duì)應(yīng)的數(shù)據(jù)庫(kù)文件,如果文件不存在,則創(chuàng)建
  2. sqlite3_close() - 關(guān)閉之前打開的數(shù)據(jù)庫(kù)
  3. sqlite3_prepare_v2() - 準(zhǔn)備一條SQL語(yǔ)句,用于執(zhí)行(SQL語(yǔ)句需要先準(zhǔn)備,之后再step執(zhí)行)
  4. sqlite3_step() - 執(zhí)行一條準(zhǔn)備好的語(yǔ)句
  5. sqlite3_column_<type>() - 獲取執(zhí)行的結(jié)果中,某一列的數(shù)據(jù),并指定獲取的類型(int, text...),如果內(nèi)部類型和獲取的類型不一致,方法內(nèi)部將會(huì)對(duì)內(nèi)容進(jìn)行類型轉(zhuǎn)換
  6. sqlite3_finalize() - 從內(nèi)存中刪除之前準(zhǔn)備好的語(yǔ)句,每一條準(zhǔn)備好的語(yǔ)句,都需要?jiǎng)h除,否則會(huì)資源泄漏
  7. sqlite3_exec() - 集成了sqlite3_prepare_v2(), sqlite3_step(), sqlite3_finalize()到一條語(yǔ)句

5. GitHub

整個(gè)數(shù)據(jù)持久化操作的Demo代碼,都存儲(chǔ)在GitHub

其中SQLite操作的內(nèi)容,在RACSQLiteDemo類中

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容