1. SQLite數(shù)據(jù)庫(kù)的特點(diǎn):
- SQLite是一款輕量級(jí)的嵌入式數(shù)據(jù)庫(kù)(用于移動(dòng)端)
- 處理數(shù)據(jù)的速度, 比MySQL還要快
- SQLite不需要進(jìn)行配置(只需要引入依賴庫(kù), 和頭文件),這就意味著不需要安裝
- SQLite的一個(gè)不需要單獨(dú)服務(wù)器進(jìn)行(維護(hù))操作的系統(tǒng), 是完全自己獨(dú)立
- SQLite是非常小的, 完全配置時(shí)小于400K, 當(dāng)省略一些可選文件時(shí)小于250K
- 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];