擇一城終老《妙蛙種子》
數據庫操作的簡單流程
- Linux系統級的SQLite技術實現框架:Build Phases —>Link With Libraries —>添加 —>sqlite —>libsqlite3.0.tbd
- 引入<sqlite3.h>頭文件
- 打開數據庫
- 對數據庫,并進行操作(執行SQL命令 建表,增刪改查)
- 關閉數據庫
**開始實現這個流程
- 首先 創建一個單例類(DataBaseHandle) 用這個類進行數據庫的一系列操作
- DataBaseHandle.m文件中引入#import <sqlite3.h>
- 給單例類聲明一個屬性NSString * dbPath (用來存放數據庫的路徑)
@property (nonatomic, copy) NSString *dbPath;````
- 設置一個全局變量的單例類型的實例變量用于控制數據庫
static DataBaseHandle *dbHandle = nil;````
- 單例類的構造方法
+ (DataBaseHandle *)sharedDataBaseHandle
if (dbHandle == nil) {
dbHandle = [[DataBaseHandle alloc] init];
}
return dbHandle;
}```
- 實現數據庫的方法在單例類里面
- 聲明一個全局變量 數據庫的實例
```static sqlite3 *db = nil;```
- 實現打開數據庫方法
``` - (void)openDB```
```{
int result = sqlite3_open(self.dbPath.UTF8String, &db);
if (result == SQLITE_OK) {
NSLog(@"打開成功");
} else {
NSLog(@"打開失敗");
}
}```
- 實現關閉數據庫方法
```- (void)closeDB```
```{
// 打開數據庫的函數
// 在數據庫里面 所有的字符串都要變成utf-8的編碼格式
int result = sqlite3_close(db);
if (result == SQLITE_OK) {
NSLog(@"關閉成功");
} else {
NSLog(@"關閉失敗");
}
}```
- 創建數據庫表
```- (void)createTable```
```{
// 創建一個person表, 要求字段:UID integer 主鍵,自增 name text, gender text, age integer
// 創建表的sql語句
NSString *createString = @"create table if not exists person (uid integer primary key autoincrement not null, name text, gender text, age integer)";
// 第一個參數:數據庫
// 第二個參數:sql語句,要用utf-8的格式
// 第三個參數:結果的回調函數
// 第四個參數:回調函數的參數
// 第五個參數:錯誤信息
int result = sqlite3_exec(db, createString.UTF8String, NULL, NULL, NULL);
// 判斷是否創建成功
if (result == SQLITE_OK) {
NSLog(@"創建表成功");
} else {
NSLog(@"創建表失敗 %d", result);
}
// 打印數據庫的地址
NSLog(@"_dbPath ==== %@", _dbPath);
}```
- 插入數據
```- (void)insertName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age```
```{
// 插入數據的sql語句,數據不確定,所以在values里面使用?代替,之后向里面綁定
NSString *insertString = @"insert into person (name, gender, age) values (?, ?, ?)";
// sqlite的伴隨指針
sqlite3_stmt *stmt = nil;
// 預執行sql語句
// 第一個參數:數據庫
// 第二個參數:sql語句
// 第三個參數:如果為正,例如 : 1, 表示在取參數的時候,只取一個字節;使用負數表示取值取到碰到結束符號('\000','u000')。
// 第四個參數:伴隨指針,會伴隨著數據庫的操作,獲取值或綁定值
// 第五個參數:取值的時候如果取的不全,那么剩下的都存在這里。
int result = sqlite3_prepare(db, insertString.UTF8String, -1, &stmt, NULL);
// 如果預執行成功的話,那么就要往里面放數據了
if (result == SQLITE_OK) {
// 向預執行的sql語句里面插入參數 (取代‘?’的位置)
// 第一個參數:伴隨指針
// 第二個參數:‘?’的位置,從1開始
// 第三個參數:插入的數據
// 第四個參數:和上面的-1是一樣的
// 第五個參數:回調函數
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語句已經全了
// 執行伴隨指針,如果為SQLITE_DONE 代表執行成功,并且成功的插入數據。
if (sqlite3_step(stmt) == SQLITE_DONE) {
NSLog(@"插入成功");
} else {
NSLog(@"插入失敗");
}
} else {
NSLog(@"%d", result);
}
// 一定要記得釋放掉伴隨指針
sqlite3_finalize(stmt);
}```
- 更新數據(修改數據)
```- (void)updateWithUID:(NSInteger)uid```
```{
NSString *updateString = @"update person set name = '更改新的數據' 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);
}
- 刪除數據庫表里的數據根據條件
- (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(@"刪除失敗");
}
}```
- 查找數據
``` - (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 的時候,代表還有下一條數據
while (sqlite3_step(stmt) == SQLITE_ROW) {
// 第二個參數:表示參數的位置,從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);
}```