CYC-數據庫的運用

創建數據庫前 需要導入 #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
發佈了33 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章