創建數據庫前 需要導入 #import
// 名字
@property (nonatomic, retain) NSString *name;
// 年齡
@property (nonatomic, assign) NSInteger age;
// 性別
@property (nonatomic, retain) NSString *gender;
// 學號
@property (nonatomic, assign) NSInteger number;
現在開始創建數據庫 方法寫在單例裏面 方便後面全局使用
#import <Foundation/Foundation.h>
#import <sqlite3.h>
#import "Student.h"
@interface SQLiteManager : NSObject
// 初始化方法
+(SQLiteManager *)shareManaher;
// 如果你要使用數據庫的話 要引入一個框架
// libsqlite3.0.dylib 框架
// 使用的話 需要引入頭文件 #import <sqlite3ext.h>
// 打開數據庫
// sqlite3 * 表示咱們的數據庫
- (sqlite3 *)openDB;
// 關閉數據庫
- (void)closeDB;
// 創建一個表
- (void)createTable;
// 插入數據
- (void)insertWith:(Student *)student;
// 刪除數據
- (void)deleteAge:(NSInteger) age;
// 修改數據
- (void)updateName:(NSString *)name byAge:(NSInteger)age;
// 查詢數據
- (Student *)selectName:(NSString *)name byAge:(NSInteger)age;
// 查詢全部數據
- (NSArray *)selectAll;
@end
具體實現
#import "SQLiteManager.h"
#import "Student.h"
@implementation SQLiteManager
// 初始化方法a
// 創建單例類 進行對數據庫 操作方法的封裝
+(SQLiteManager *)shareManaher
{
static SQLiteManager *manager = nil;
if (manager == nil) {
manager = [[SQLiteManager alloc] init];
}
return manager;
}
#pragma mark - 實現方法
// 定義一個靜態指針 負責連接數據庫
// 保證數據庫 直到程序結束 纔會釋放
static sqlite3 *db = nil;
// 打開數據庫
- (sqlite3 *)openDB
{
// 判斷
// 如果數據不爲空的話 就說明數據庫存在 直接返回就行
if(db != nil) {
return db;
}
// 不存在 就去創建
// 獲取路徑
// NSArray *documentsArr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// NSString *documentsPath = documentsArr[0];
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
// 拼接路徑
// 數據庫的名稱
NSString *dbPath = [documentsPath stringByAppendingPathComponent:@"Student.sqlite"];
NSLog(@"%@", dbPath);
// 創建數據庫
// 參數一 文件路徑
// 參數2 數據庫地址
// sqlite3_open 該函數 如果有數據庫 就打開 沒有 就創建一個
int result = sqlite3_open(dbPath.UTF8String, &db);
// 查看命令返回結果
// SQLITE_OK表示成功
if (result == SQLITE_OK) {
NSLog(@"創建成功 或者 打開成功");
}else {
NSLog(@"創建失敗 或者 打開失敗");
}
return db;
}
// 關閉數據庫
- (void)closeDB
{
// 關閉數據庫 也是一個函數
int result = sqlite3_close(db);
if (result == SQLITE_OK) {
// 如果成功的話 把數據庫置爲空
db = nil;
NSLog(@"關閉數據庫成功");
}else {
NSLog(@"關閉數據庫失敗");
}
}
// 創建一個表
- (void)createTable
{
// 步驟
// 1. 打開數據庫
db = [self openDB];
// 2. 寫創建表的sql語句
NSString *sql = @"create table IF NOT EXISTS Student(number integer primary key not NULL, name text not NULL, gender text not NULL, age integer not NULL)";
// 3. 執行sql語句
// char **errmsg 錯誤信息
char *error = nil;
int result = sqlite3_exec(db, sql.UTF8String, nil, nil, &error);
// 4. 判斷是否成功
if (result == SQLITE_OK) {
NSLog(@"創建表成功");
}else {
NSLog(@"創建表失敗");
}
// 5. 關閉數據庫
[self closeDB];
}
// 插入數據
// 插入的不是model 而是model的信息
- (void)insertWith:(Student *)student
{
// 1.打開數據庫
db = [self openDB];
// 2. 寫sql語句
NSString *sql = [NSString stringWithFormat:@"insert into Student(name, gender, age, number) values('%@', '%@', '%ld', '%ld')", student.name, student.gender, student.age, student.number];
// 3. 執行語句
int result = sqlite3_exec(db, sql.UTF8String, nil, nil, nil);
// 4. 判斷是否成功
if (result == SQLITE_OK) {
NSLog(@"插入表成功");
}else {
NSLog(@"插入表失敗");
}
// 5. 關閉數據庫
[self closeDB];
}
// 刪除數據
- (void)deleteAge:(NSInteger) age
{
// 打開數據庫
db = [self openDB];
// 寫sql 語句
NSString *sql = [NSString stringWithFormat:@"delete from Student where age > '%ld' ", age];
// 執行語句
int result = sqlite3_exec(db, sql.UTF8String, nil, nil, nil);
// 判斷是否成功
if (result == SQLITE_OK) {
NSLog(@"刪除成功");
}else {
NSLog(@"刪除失敗");
}
// 關閉數據庫
[self closeDB];
}
// 修改數據
// 修改數據
- (void)updateName:(NSString *)name byAge:(NSInteger)age
{
// 打開數據庫
db = [self openDB];
// 寫sql語句
NSString *sql = [NSString stringWithFormat:@"update Student set age = '%ld' where name = '%@'",age, name];
// 執行sql語句
int result = sqlite3_exec(db, sql.UTF8String, nil, nil, nil);
// 判斷是否成功
if (result == SQLITE_OK) {
NSLog(@"修改數據成功");
}else {
NSLog(@"修改數據失敗");
}
// 關閉數據庫
[self closeDB];
}
// 查詢數據 根據名字 和 年齡 查詢學生
- (Student *)selectName:(NSString *)name byAge:(NSInteger)age
{
// 1. 打開數據庫
db = [self openDB];
// 2.寫sql語句
NSString *sql = [NSString stringWithFormat:@"select * from Student where name = '%@' and age = '%ld'",name, age];
// 3.創建跟隨指針 保存sql語句
sqlite3_stmt *stmt = nil;
// 4.執行sql語句
// int nbyte 表示sql語句的長度 -1 代表無限長
// const char **pzTail 截取未執行的部分語句
int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, nil);
// 5.判斷是否成功
if (result == SQLITE_OK) {
NSLog(@"查詢數據成功");
// 6.綁定查詢條件信息
// 查詢的條件是啥類型的 就算sqlite3_bind_啥類型
// 參數二 查詢條件的順序 從1開始
// 參數三 填 查詢條件的 字段名
// 參數四 長度 -1
// 參數五 綁定後執行的函數
sqlite3_bind_text(stmt, 1, name.UTF8String, -1, nil);
// 綁定條件二
sqlite3_bind_int(stmt, 2, -1);
// 7.開始查詢
// sqlite3_step(stmt) == SQLITE_ROW
// 如果這條語句 可以被找到 就返回SQLITE_ROW
while (sqlite3_step(stmt) == SQLITE_ROW) {
// 8. 獲取數據
// 參數二 <#int iCol#> 在數據庫表中 列數從0開始 需要打開數據庫看一下 在第幾列
char *name = (char *)sqlite3_column_text(stmt, 1);
char *gender = (char *) sqlite3_column_text(stmt, 2);
int age = sqlite3_column_int(stmt, 3);
int number = sqlite3_column_int(stmt, 0);
// 9. 給對象進行賦值
Student *student = [[Student alloc] init] ;
// 把C語言的字符串 轉回OC字符串
student.name = [NSString stringWithUTF8String:name];
student.gender = [NSString stringWithUTF8String:gender];
student.age = age;
student.number = number;
// 10.釋放跟隨指針
sqlite3_finalize(stmt);
// 關閉數據庫
[self closeDB];
// 11. 返回數據
return [student autorelease];
}
} else {
NSLog(@"查詢數據失敗");
}
// 關閉數據庫
[self closeDB];
return nil;
}
// 查詢全部數據
- (NSArray *)selectAll
{
// 1.打開數據庫
db = [self openDB];
//2. 寫sql語句
NSString *sql = [NSString stringWithFormat:@"select * from Student"];
// 3.創建跟隨指針 保存sql語句
sqlite3_stmt *stmt = nil;
// 4.執行查詢語句
int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, nil);
// 5.判斷是否成功
if (result == SQLITE_OK) {
NSLog(@"查詢數據成功");
// 6.不用綁定查詢條件 創建一個數組 保存查詢好的 model
NSMutableArray *array = [NSMutableArray array];
// 7.開始查詢
while (sqlite3_step(stmt) == SQLITE_ROW) {
// 8.讀取數據
char *name = (char *)sqlite3_column_text(stmt, 1);
char *gender = (char *) sqlite3_column_text(stmt, 2);
int age = sqlite3_column_int(stmt, 3);
int number = sqlite3_column_int(stmt, 0);
// 9.創建 model 並賦值
Student *model = [[Student alloc] init];
model.name = [NSString stringWithUTF8String:name];
model.gender = [NSString stringWithUTF8String:gender];
model.age = age;
model.number = number;
// 10. 把model 裝進數組中
[array addObject:model];
// 11. 釋放model對象
[model release];
}
//12. 釋放跟隨指針
sqlite3_finalize(stmt);
// 13. 關閉 數據庫
[self closeDB];
// 14.返回數組
return array;
} else {
NSLog(@"查詢數據失敗");
}
// 15. 關閉數據庫
[self closeDB];
return nil;
}
@end