SQLite數(shù)據(jù)庫(kù)基本操作

1. SQLite數(shù)據(jù)庫(kù)的特點(diǎn):

  1. SQLite是一款輕量級(jí)的嵌入式數(shù)據(jù)庫(kù)(用于移動(dòng)端)
  2. 處理數(shù)據(jù)的速度, 比MySQL還要快
  3. SQLite不需要進(jìn)行配置(只需要引入依賴庫(kù), 和頭文件),這就意味著不需要安裝
  4. SQLite的一個(gè)不需要單獨(dú)服務(wù)器進(jìn)行(維護(hù))操作的系統(tǒng), 是完全自己獨(dú)立
  5. SQLite是非常小的, 完全配置時(shí)小于400K, 當(dāng)省略一些可選文件時(shí)小于250K
  6. SQLite是自給自足的, 也就意味著不需要任何的外部依賴

2. SQLite數(shù)據(jù)庫(kù)的基本操作

打開(kāi)數(shù)據(jù)庫(kù)格式 :      sqlite3_open(數(shù)據(jù)庫(kù)路徑.UTF8String, 指向數(shù)據(jù)庫(kù)的地址的地址);
創(chuàng)建表格式:          create table 表名 ( 字段名1 字段類型  約束1 約束2 ,字段2  約束2);
插入數(shù)據(jù)(增)格式:     insert into 表名(name,age) values(‘大王',10); 
刪除數(shù)據(jù)(刪)格式:     delete from 表名 where 條件
修改數(shù)據(jù)(改)格式:     update  表名  set 字段名 = 值  where 條件字段 = 滿足條件//修改的不僅僅是一條記錄
查詢數(shù)據(jù)(查)格式:     select 字段* from 表名 where 條件
關(guān)閉數(shù)據(jù)庫(kù)格式:       sqlite3_close(數(shù)據(jù)庫(kù)指針);

3. SQLite的具體實(shí)例應(yīng)用

文件結(jié)構(gòu)

<ol>
<li> 單例類(DataBaseHandle)(工具類, 所有sqlite語(yǔ)句都封裝到該類中, 在controller中用該類的對(duì)象調(diào)用數(shù)據(jù)庫(kù)的基本操作(方法))
<li>controller類(ViewConteoller)(類中調(diào)用單例類, 并初始化一個(gè)單例類對(duì)象, 調(diào)用數(shù)據(jù)庫(kù)操作方法)
</ol>

文件內(nèi)容

DataBaseHandle.h文件

#import <Foundation/Foundation.h>
//第一步: 導(dǎo)入依賴庫(kù)
//第二步: 引入頭文件
#import <sqlite3.h>
@interface DBHandle : NSObject
//初始化單例類對(duì)象的方法
+ (DBHandle*)shareDBHandle;
//打開(kāi)數(shù)據(jù)庫(kù)方法
- (void)openDB;
//關(guān)閉數(shù)據(jù)庫(kù)方法
- (void)closeDB;
//建表
- (void)setCreate;
//增加記錄(此處以姓名,年齡)
- (void)insertWithName:(NSString *)name age:(NSInteger)age;
//刪除記錄(SID)
- (void)deleteStudentByID:(NSInteger)SID;
//更新數(shù)據(jù)(根據(jù)字段age)
- (void)updateWithAge:(NSInteger)age;
//查找數(shù)據(jù)(根據(jù)字典name)
- (void)selectWithName:(NSString *)name;
//刪除表
- (void)clearDB;
@end

DataBaseHandle.m文件
#import "DBHandle.h"
//創(chuàng)建代理對(duì)象
static DBHandle *dataBase = nil;
@interface DBHandle ()
//保存數(shù)據(jù)庫(kù)路徑
@property (nonatomic, copy)NSString *dataBasePath;
@end
@implementation DBHandle

<h2> 實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作的方法</h2>

//初始化單例類對(duì)象的房    
+ (DBHandle *)shareDBHandle{
    if (dataBase == nil) {
        dataBase = [[DBHandle alloc] init];
    }
  return dataBase;
}

<h5> *返回?cái)?shù)據(jù)庫(kù)文件路徑</h5>

- (NSString *)dataBasePath{  
if (_dataBasePath == nil) {
    //1. 獲取數(shù)據(jù)庫(kù)路徑
    NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,         NSUserDomainMask, YES)firstObject];
    //2. 拼接數(shù)據(jù)庫(kù)文件
    _dataBasePath = [documents stringByAppendingString:@"/student.sqlite"];
    }
    return _dataBasePath;
}

<h5> *數(shù)據(jù)庫(kù)指針</h5>

//數(shù)據(jù)庫(kù)指針: 因?yàn)楹枚嗟胤蕉紩?huì)使用到數(shù)據(jù)庫(kù), 所以初始化一個(gè)數(shù)據(jù)庫(kù)靜態(tài)變量
//創(chuàng)建數(shù)據(jù)庫(kù)指針
static sqlite3 *db = nil;

<h4> *打開(kāi)數(shù)據(jù)庫(kù)方法</h4>

 //打開(kāi)數(shù)據(jù)庫(kù)方法
- (void)openDB{

    NSLog(@"databasePath = %@", self.dataBasePath);


    //定義一個(gè)BooL類型的數(shù)據(jù), 用來(lái)接收打開(kāi)數(shù)據(jù)庫(kù)的結(jié)果
    //參數(shù)一: 數(shù)據(jù)庫(kù)存儲(chǔ)的路徑 (c語(yǔ)言形式.UTF8String)
    //參數(shù)二: 數(shù)據(jù)庫(kù)的地址 &
    BOOL result = sqlite3_open(self.dataBasePath.UTF8String, &db);
    if (result == SQLITE_OK) {
    
        NSLog(@"打開(kāi)成功");
    }else{
    
        NSLog(@"打開(kāi)失敗");
    }
}

<h4> * 關(guān)閉數(shù)據(jù)庫(kù)方法</h4>

//關(guān)閉數(shù)據(jù)庫(kù)方法
- (void)closeDB{

    BOOL result = sqlite3_close(db);
    if (result == SQLITE_OK) {
    
        NSLog(@"關(guān)閉成功");
    }else{
    
        NSLog(@"關(guān)閉失敗");
    }
}

<h4> *建表 </h4>

//建表
- (void)setCreate{

    //1. 準(zhǔn)備SQL語(yǔ)句 , 創(chuàng)建一個(gè)Stu表
    NSString *sqlString = @"create table if not exists stu(s_id integer primary key autoincrement not null, s_name text, s_age integer)";

    //2. 執(zhí)行SQL語(yǔ)句
    //參數(shù)一:  數(shù)據(jù)庫(kù)
    //參數(shù)二:  要執(zhí)行的sql語(yǔ)句(要求轉(zhuǎn)換成C語(yǔ)言的格式)
    //參數(shù)三:  表示結(jié)果回調(diào)一個(gè)函數(shù)
    //參數(shù)四:  回調(diào)一個(gè)函數(shù)參數(shù)
    //參數(shù)五:  錯(cuò)誤信息
    int result = sqlite3_exec(db, sqlString.UTF8String, NULL, NULL, NULL);
    if (result == SQLITE_OK) {

        NSLog(@"創(chuàng)建表成功");
    }else{
    
        NSLog(@"創(chuàng)建表失敗%d", result);
    }

}

<h4>* 增加記錄(此處以姓名,年齡) </h4>

//增加記錄(此處以姓名,年齡)
- (void)insertWithName:(NSString *)name age:(NSInteger)age{

    //1. 準(zhǔn)備SQL語(yǔ)句(當(dāng)values的值不確定的時(shí)候,需要使用"?"來(lái)代替, 之后需要對(duì)其進(jìn)行綁定)
    NSString *SQLString = @"insert into stu(s_name, s_age) values(?,?)";

    //2. 創(chuàng)建伴隨指針(用于綁定參數(shù), 獲取數(shù)據(jù))
    sqlite3_stmt *stmt = NULL;

    //3. 預(yù)執(zhí)行
    //參數(shù)一: 數(shù)據(jù)庫(kù)
    //參數(shù)二: sql語(yǔ)句(C語(yǔ)言的格式, 所以需要進(jìn)行轉(zhuǎn)碼:UTF8String)
    //參數(shù)三: 有正負(fù)之分(正: 代表只往后讀一個(gè)字節(jié). 負(fù): 遇到特殊符號(hào)才會(huì)結(jié)束,例如:\000, u000) s_name = @"zhang\000san"
    //參數(shù)四: 伴隨指針的地址
    //參數(shù)五: 表示取值的時(shí)候只取一部分, 剩余的部分會(huì)存儲(chǔ)在這里

    int result = sqlite3_prepare(db, SQLString.UTF8String, -1, &stmt, NULL);

    if (result == SQLITE_OK) {
    
        NSLog(@"添加預(yù)處理成功");
        //4. 綁定參數(shù)
        //參數(shù)一: 伴隨指針 -->用于綁定參數(shù),獲取數(shù)值
        //參數(shù)二: 綁定參數(shù)位置( "?" 的位置, 從1開(kāi)始)
        //參數(shù)三: 表示要插入的值(形參),需要進(jìn)行UTF8String轉(zhuǎn)換
        //參數(shù)四: 有正負(fù)之分(正: 代表只往后讀一個(gè)字節(jié). 負(fù): 遇到特殊符號(hào)才會(huì)結(jié)束,例如:\000, u000) s_name = @"zhang\000san"
        //參數(shù)五: 回調(diào)一個(gè)函數(shù)
        sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL); //對(duì)Name進(jìn)行綁定
        sqlite3_bind_int64(stmt, 2, age);
    
        //5. 執(zhí)行伴隨指針(sql語(yǔ)句執(zhí)行完畢后, 根據(jù)伴隨指針的情況判斷是否插入成功(SQLITE_DONE: 表示伴隨指針執(zhí)行數(shù)據(jù)成功))
        if (sqlite3_step(stmt) == SQLITE_DONE) {
        
            NSLog(@"插入成功");
        }else{
        
            NSLog(@"插入失敗%d", result);
        }
    
    }else{
    
        NSLog(@"添加預(yù)處理失敗%d", result);
    }

    //6. 釋放伴隨指針
    sqlite3_finalize(stmt);

//第二種方式:
    //NSString *SQLString = [NSString stringWithFormat:@"insert into stu(s_name, s_age) values('%@', %ld)",name, age];
    //int result = sqlite3_exec(db, SQLString.UTF8String, NULL, NULL, NULL);

}

<h4>* 刪除記錄(SID)</h4>

//刪除記錄(SID)
- (void)deleteStudentByID:(NSInteger)SID{

    //1. 準(zhǔn)備SQL語(yǔ)句
    NSString *sqlString = [NSString stringWithFormat:@"delete from stu where s_id = %ld",SID];

    //2. 執(zhí)行sql語(yǔ)句
int result = sqlite3_exec(db, sqlString.UTF8String, NULL, NULL, NULL);

    //3. 結(jié)果
    if (result == SQLITE_OK) {
    
        NSLog(@"刪除數(shù)據(jù)成功%ld", SID);
    
    }else{
    
        NSLog(@"刪除失敗%d", result);
    }

}

<h4> *更新數(shù)據(jù)(根據(jù)字段age)</h4>

//更新數(shù)據(jù)(根據(jù)字段age)
- (void)updateWithAge:(NSInteger)age{

    //1. 準(zhǔn)備SQL語(yǔ)句(無(wú)條件時(shí), 不做更新)
    NSString *sqlString = @"update stu set s_age = ? where s_age = 18";

    //2. 創(chuàng)建伴隨指針
    sqlite3_stmt *stmt = NULL;

    //3. 預(yù)執(zhí)行
    int result = sqlite3_prepare(db, sqlString.UTF8String, -1, &stmt, NULL);

    if (result == SQLITE_OK) {
    
        NSLog(@"預(yù)處理成功");
        //4. 綁定參數(shù)
        sqlite3_bind_int64(stmt, 1, age);
    
        //5. 執(zhí)行判斷伴隨指針是否綁定成功
        if (sqlite3_step(stmt) == SQLITE_DONE) {
        
            NSLog(@"更新成功");
        }else{
        
            NSLog(@"更新失敗");
        }
    
    }else{
    
    NSLog(@"語(yǔ)句錯(cuò)誤");
}

    //6. 釋放伴隨指針
    sqlite3_finalize(stmt);

//第二種方法:
    //NSString *sqlString = [NSString stringWithFormat:@"update stu set s_age = %ld where s_age = 20", age];

    //int result = sqlite3_exec(db, sqlString.UTF8String, NULL, NULL, NULL);

}

<h4>*查找數(shù)據(jù)(根據(jù)字典name)</h4>

//查找數(shù)據(jù)(根據(jù)字典name)
- (void)selectWithName:(NSString *)name{

    //1. 準(zhǔn)備sql語(yǔ)句
    //NSString *sqlString = @"select * from stu where  s_name = ?";
    NSString *sqlString = [NSString stringWithFormat:@"select * from stu where s_name = '%@'", name]; //添加 單引號(hào)

    //2. 創(chuàng)建伴隨指針
    sqlite3_stmt *stmt = nil;

    //3. 預(yù)執(zhí)行
    int result = sqlite3_prepare(db, sqlString.UTF8String, -1, &stmt, NULL);

   if (result == SQLITE_OK) {
        
        //4. 綁定數(shù)據(jù)
       sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);
    
        while (sqlite3_step(stmt) == SQLITE_ROW) {
        
            //從伴隨指針獲取數(shù)據(jù)(第一列)
            int s_id = sqlite3_column_int(stmt, 0);
        
            //從伴隨指針獲取數(shù)據(jù)(第二列)
            NSString *s_name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
        
            //從伴隨指針獲取數(shù)據(jù)(第三列)
            int s_age = sqlite3_column_int(stmt, 2);
        
            NSLog(@"s_id = %d, s_name = %@, s_age = %d", s_id, s_name, s_age);   
        }

    }else{
    
          NSLog(@"查找失敗%d", result);
    
    }

    //釋放伴隨指針
    sqlite3_finalize(stmt);
}

<h4>* 清除表內(nèi)容 和刪除數(shù)據(jù)庫(kù)表</h4>

//清除表內(nèi)容 和刪除數(shù)據(jù)庫(kù)表
- (void)clearDB{

    //1. 準(zhǔn)備sql 語(yǔ)句
    NSString *sql = @"delete from stu";
    //刪除表
    //NSString *sql = @"drop table stu";

    //2. 執(zhí)行
    sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL); 
}
 @end

viewController.m文件

#import "DBHandle.h"
DBHandle *db = [DBHandle shareDBHandle]; 
//打開(kāi)數(shù)據(jù)庫(kù)
[db openDB];
//建表
[db setCreate];
//插入
[db insertWithName:@"帥哥" age:20];
//刪除
//[db deleteStudentByID:1];
//更新
[db updateWithAge:10];
[db selectWithName:@"美女007"];
[db clearDB];
//關(guān)閉數(shù)據(jù)庫(kù)
[db closeDB];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市昨寞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件陕截,死亡現(xiàn)場(chǎng)離奇詭異载庭,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)瓷马,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)刻炒,“玉大人决采,你說(shuō)我怎么就攤上這事》匕拢” “怎么了树瞭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)爱谁。 經(jīng)常有香客問(wèn)我晒喷,道長(zhǎng),這世上最難降的妖魔是什么访敌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任凉敲,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘爷抓。我一直安慰自己势决,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布蓝撇。 她就那樣靜靜地躺著果复,像睡著了一般。 火紅的嫁衣襯著肌膚如雪渤昌。 梳的紋絲不亂的頭發(fā)上虽抄,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音独柑,去河邊找鬼迈窟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛忌栅,可吹牛的內(nèi)容都是我干的车酣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼狂秘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼骇径!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起者春,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎清女,沒(méi)想到半個(gè)月后钱烟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嫡丙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年拴袭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片曙博。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拥刻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出父泳,到底是詐尸還是另有隱情般哼,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布惠窄,位于F島的核電站蒸眠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏杆融。R本人自食惡果不足惜楞卡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蒋腮,春花似錦淘捡、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至险绘,卻和暖如春踢京,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宦棺。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工瓣距, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人代咸。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓蹈丸,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親呐芥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逻杖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容