數(shù)據(jù)庫操作的簡單流程
- Linux系統(tǒng)級的SQLite技術實現(xiàn)框架:Build Phases —>Link With Libraries —>添加 —>sqlite —>libsqlite3.0.tbd
- 引入<sqlite3.h>頭文件
- 打開數(shù)據(jù)庫
- 對數(shù)據(jù)庫,并進行操作(執(zhí)行SQL命令 建表,增刪改查)
- 關閉數(shù)據(jù)庫
**開始實現(xiàn)這個流程
- 首先 創(chuàng)建一個單例類(DataBaseHandle) 用這個類進行數(shù)據(jù)庫的一系列操作
- DataBaseHandle.m文件中引入#import <sqlite3.h>
- 給單例類聲明一個屬性NSString * dbPath (用來存放數(shù)據(jù)庫的路徑)
@property (nonatomic, copy) NSString *dbPath;````
- 設置一個全局變量的單例類型的實例變量用于控制數(shù)據(jù)庫
static DataBaseHandle *dbHandle = nil;````
- 單例類的構造方法
+ (DataBaseHandle *)sharedDataBaseHandle
if (dbHandle == nil) {
dbHandle = [[DataBaseHandle alloc] init];
}
return dbHandle;
}```
- 實現(xiàn)數(shù)據(jù)庫的方法在單例類里面
- 聲明一個全局變量 數(shù)據(jù)庫的實例
```static sqlite3 *db = nil;```
- 實現(xiàn)打開數(shù)據(jù)庫方法
``` - (void)openDB```
```{
int result = sqlite3_open(self.dbPath.UTF8String, &db);
if (result == SQLITE_OK) {
NSLog(@"打開成功");
} else {
NSLog(@"打開失敗");
}
}```
- 實現(xiàn)關閉數(shù)據(jù)庫方法
```- (void)closeDB```
```{
// 打開數(shù)據(jù)庫的函數(shù)
// 在數(shù)據(jù)庫里面 所有的字符串都要變成utf-8的編碼格式
int result = sqlite3_close(db);
if (result == SQLITE_OK) {
NSLog(@"關閉成功");
} else {
NSLog(@"關閉失敗");
}
}```
- 創(chuàng)建數(shù)據(jù)庫表
```- (void)createTable```
```{
// 創(chuàng)建一個person表乖坠, 要求字段:UID integer 主鍵萄喳,自增 name text检碗, gender text邓了, age integer
// 創(chuàng)建表的sql語句
NSString *createString = @"create table if not exists person (uid integer primary key autoincrement not null, name text, gender text, age integer)";
// 第一個參數(shù):數(shù)據(jù)庫
// 第二個參數(shù):sql語句助被,要用utf-8的格式
// 第三個參數(shù):結果的回調函數(shù)
// 第四個參數(shù):回調函數(shù)的參數(shù)
// 第五個參數(shù):錯誤信息
int result = sqlite3_exec(db, createString.UTF8String, NULL, NULL, NULL);
// 判斷是否創(chuàng)建成功
if (result == SQLITE_OK) {
NSLog(@"創(chuàng)建表成功");
} else {
NSLog(@"創(chuàng)建表失敗 %d", result);
}
// 打印數(shù)據(jù)庫的地址
NSLog(@"_dbPath ==== %@", _dbPath);
}```
- 插入數(shù)據(jù)
```- (void)insertName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age```
```{
// 插入數(shù)據(jù)的sql語句钧大,數(shù)據(jù)不確定竟稳,所以在values里面使用健蕊?代替舔箭,之后向里面綁定
NSString *insertString = @"insert into person (name, gender, age) values (?, ?, ?)";
// sqlite的伴隨指針
sqlite3_stmt *stmt = nil;
// 預執(zhí)行sql語句
// 第一個參數(shù):數(shù)據(jù)庫
// 第二個參數(shù):sql語句
// 第三個參數(shù):如果為正罩缴,例如 : 1蚊逢, 表示在取參數(shù)的時候,只取一個字節(jié);使用負數(shù)表示取值取到碰到結束符號('\000','u000')箫章。
// 第四個參數(shù):伴隨指針烙荷,會伴隨著數(shù)據(jù)庫的操作,獲取值或綁定值
// 第五個參數(shù):取值的時候如果取的不全檬寂,那么剩下的都存在這里终抽。
int result = sqlite3_prepare(db, insertString.UTF8String, -1, &stmt, NULL);
// 如果預執(zhí)行成功的話,那么就要往里面放數(shù)據(jù)了
if (result == SQLITE_OK) {
// 向預執(zhí)行的sql語句里面插入?yún)?shù) (取代‘桶至?’的位置)
// 第一個參數(shù):伴隨指針
// 第二個參數(shù):‘昼伴?’的位置,從1開始
// 第三個參數(shù):插入的數(shù)據(jù)
// 第四個參數(shù):和上面的-1是一樣的
// 第五個參數(shù):回調函數(shù)
sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);
sqlite3_bind_text(stmt, 2, gender.UTF8String, -1, NULL);
sqlite3_bind_int64(stmt, 3, age);
// sql語句已經(jīng)全了
// 執(zhí)行伴隨指針镣屹,如果為SQLITE_DONE 代表執(zhí)行成功圃郊,并且成功的插入數(shù)據(jù)。
if (sqlite3_step(stmt) == SQLITE_DONE) {
NSLog(@"插入成功");
} else {
NSLog(@"插入失敗");
}
} else {
NSLog(@"%d", result);
}
// 一定要記得釋放掉伴隨指針
sqlite3_finalize(stmt);
}```
- 更新數(shù)據(jù)(修改數(shù)據(jù))
```- (void)updateWithUID:(NSInteger)uid```
```{
NSString *updateString = @"update person set name = '更改新的數(shù)據(jù)' where uid = ?"; //?是要改的條件 在哪里修改成?的值
// 伴隨指針
sqlite3_stmt *stmt = nil;
int result = sqlite3_prepare(db, updateString.UTF8String, -1, &stmt, NULL);
if (result == SQLITE_OK) {
sqlite3_bind_int64(stmt, 1, uid);
if (sqlite3_step(stmt) == SQLITE_DONE) {
NSLog(@"修改成功");
}
}
sqlite3_finalize(stmt);
}
- 刪除數(shù)據(jù)庫表里的數(shù)據(jù)根據(jù)條件
- (void)deleteWithUID:(NSInteger)uid
NSString *deleteString = [NSString stringWithFormat:@"delete from person where uid = %ld", uid];
int result = sqlite3_exec(db, deleteString.UTF8String, NULL, NULL, NULL);
if (result == SQLITE_OK) {
NSLog(@"刪除成功");
} else {
NSLog(@"刪除失敗");
}
}```
- 查找數(shù)據(jù)
``` - (void)searchAll```
```{
NSString *searchString = @"select * from person";
sqlite3_stmt *stmt = nil;
int result = sqlite3_prepare(db, searchString.UTF8String, -1, &stmt, NULL);
if (result == SQLITE_OK) {
// 當sqlite3_step(stmt) == SQLITE_ROW 的時候女蜈,代表還有下一條數(shù)據(jù)
while (sqlite3_step(stmt) == SQLITE_ROW) {
// 第二個參數(shù):表示參數(shù)的位置持舆,從0開始
int uid = sqlite3_column_int(stmt, 0);
NSLog(@"%d", uid);
NSString *name = [NSString stringWithUTF8String:(const char *) sqlite3_column_text(stmt, 1)]
NSLog(@"name === %@", name);
NSString *gender = [NSString stringWithUTF8String:(const char *) sqlite3_column_text(stmt, 2)];
NSLog(@"gender ==== %@", gender);
int age = sqlite3_column_int(stmt, 3);
NSLog(@"age == %d", age);
}
}
sqlite3_finalize(stmt);
}```