ios數據庫的增刪改查

//導入框架

//創建一個學生對象NSObject,在.h中寫入

@interface Student : NSObject


@property (nonatomic, retain)NSString *name;

@property (nonatomic, retain)NSString *sex;

@property (nonatomic, assign)NSInteger number;


@end

//在學生對象.m中寫入

- (void)dealloc

{

    [_name release];

    [_sex release];

    [super dealloc];

}



//創建一個數據庫名字DataBaseHandler的NSObject,.h文件中寫入下面聲明方法

#import <Foundation/Foundation.h>

#import <sqlite3.h>

//引入學生頭文件

#import "Student.h"

//在數據庫的.h文件中寫下面代碼

@interface DataBaseHandler : NSObject

{

    //數據庫指針, 指向本地的數據庫文件

    sqlite3 *dbPoint;


}

//創建數據庫的單例的創建方法

//單例的創建方法

//1.類方法

+ (DataBaseHandler *)shareInstance;



//打開數據庫

- (BOOL)openDB;



//關閉數據庫

- (BOOL)closeDB;



//創建表

- (BOOL)createTable;



//添加一條學生數據

- (BOOL)insertStudent:(Student *)stu;



//查詢所有學生

- (NSMutableArray *)selectAll;



//修改(名字)

- (BOOL)updateStudent:(Student *)stu withName:(NSString *)newName;



//刪除

- (BOOL)deleteStudentWithNumber:(int)number;


//在數據庫的.m文件中寫入以下內容

#import "DataBaseHandler.h"


@implementation DataBaseHandler


//數據庫單例實現

+ (DataBaseHandler *)shareInstance

{

    //當第一次執行的時候會產生一個空指針

    static DataBaseHandler *handler = nil;

    

    //對指針進行判斷, 當第一次執行的時候創建一個對象

    if (handler == nil) {

        

        handler = [[DataBaseHandler alloc] init];

 

    }

    

    //無論是創建的和已經存在的, 都在這裏直接return出去

    return handler;

}


//打開數據庫

-(BOOL)openDB

{

    //1.拼接一個數據庫文件路徑

    

    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

    //documents文件夾下拼接一個數據庫文件地址

    NSString *dbPath = [docPath stringByAppendingPathComponent:@"suibian.db"];

    

    

    

    //參數1:數據庫文件存儲的路徑(UTF8String可以直接將oc語言字符串轉成c語言字符串)

    //參數2:數據庫dbPoint指針地址

    //返回值:執行sqlite函數的結果(int類型)

    int result = sqlite3_open([dbPath UTF8String], &dbPoint);

    

    

    if (result == SQLITE_OK ) {

        

        NSLog(@"打開成功");

        return YES;

        

    }else {

        NSLog(@"打開失敗");

        return NO;

    }


}


//關閉數據庫

-(BOOL)closeDB

{

    int result = sqlite3_close(dbPoint);

    

    //利用封裝的方法判斷結果

    return [self judgeResult:result text:@"關閉"];

    

}


//判斷結果的方法

- (BOOL)judgeResult:(int)result text:(NSString *)text

{

    if (result == SQLITE_OK) {

        

        NSLog(@"%@成功", text);

        return YES;

        

    }

    else{

        NSLog(@"%@失敗", text);

        NSLog(@"錯誤編碼: %d", result);


        return NO;

    }


}


//創建表的方法實現

- (BOOL)createTable

{

    NSString *sql = @"create table student(name text, number int primary key, sex text)";

    

    //執行sql語句的函數

    

    //參數1:數據庫指針

    //參數2:sql語句

    int result = sqlite3_exec(dbPoint, [sql UTF8String], NULL, NULL, NULL);

    

    return [self judgeResult:result text:@"創建表"];

    

}



//添加一條學生數據方法實現

- (BOOL)insertStudent:(Student *)stu

{

    //拼接sql語句的時候注意:字符串要以單引號(')標記, 其他的都不標記

    NSString *sql = [NSString stringWithFormat:@"insert into student values('%@', %ld, '%@')", stu.name, stu.number, stu.sex];

    

    //執行sql語句, 判斷結果

    

    int result = sqlite3_exec(dbPoint, [sql UTF8String], NULL, NULL, NULL);

    

    return [self judgeResult:result text:@"添加數據"];


    

}


//查詢所有學生方法實現

- (NSMutableArray *)selectAll

{

    //1.創建一個數據庫的替身, 存儲對數據庫的所有操作

    

    sqlite3_stmt *stmt = nil;

    

    //2.準備sql語句並執行, 將結果保存在stmt

    

    NSString *sql = @"select * from student";

    

    //參數1:數據庫指針

    //參數2:sql語句

    //參數3:限制sql語句的長度(如果是-1的話, 就是不限制)

    //參數4:替身指針的地址

    //作用:讓數據庫執行sql語句, 並把結果保存到stmt

    int result = sqlite3_prepare_v2(dbPoint, [sql UTF8String], -1, &stmt, NULL);

    

    //3.創建一個可變數組, 用於存儲數據

    

    NSMutableArray *stuArr = [NSMutableArray array];

    

    //4.去遍歷所有的數據, 創建相應的學生對象

    

    if (result == SQLITE_OK) {

        

        //sql執行成功, 遍歷數據

        //循環遍歷所有的結果, 每次遍歷到一條數據, 都會返回SQLITE_ROW, 如果沒有數據了, 就不會返回SQLITE_ROW, 跳出循環

        while (sqlite3_step(stmt) == SQLITE_ROW) {

            

            //在循環體中去按例取數據

            

            //text類型的數據取法

            

            //參數1:替身

            //參數2:第幾列

            const unsigned char *nameChar = sqlite3_column_text(stmt, 0);

            

            //char *字符串類型轉爲NSString字符串

            

            NSString *name = [NSString stringWithUTF8String:(const char *)nameChar];

            

            

            //int類型的數據

            

            int number = sqlite3_column_int(stmt, 1);

            

            

            //text類型的數據

            

            const unsigned char *sexChar = sqlite3_column_text(stmt, 2);

            

            //char *字符串類型轉爲NSString字符串

            

            NSString *sex = [NSString stringWithUTF8String:(const char *)sexChar];

            

            Student *stu = [[Student alloc] init];

            //拿獲取到得數據 給學生對象賦值

            stu.name = name;

            stu.number = number;

            stu.sex = sex;

            

            //將學生對象添加到數組中

            [stuArr addObject:stu];

            [stu release];

            

        }

        

    }

    //銷燬stmt替身, 把裏面的操作和結果寫入本地sqlite文件

    sqlite3_finalize(stmt);

    

    return stuArr;

}


//刪除數據,根據主鍵刪除

- (BOOL)deleteStudentWithNumber:(int)number

{

    NSString *sql = [NSString stringWithFormat:@"delete from student where number = '%d'", number];

    int result = sqlite3_exec(dbPoint, [sql UTF8String], NULL, NULL, NULL);

    

    return [self judgeResult:result text:@"刪除數據"];

}


//在主頁的ViewController中寫入

- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view.

    

    //單例的使用

    DataBaseHandler *dataHandler = [DataBaseHandler shareInstance];

    

    //打開數據庫(調用)

    [dataHandler openDB];

    

    //創建表成功

    [dataHandler createTable];

    

    //添加數據

    Student *stu1 = [[Student alloc] init];

    stu1.name = @"aaa";

    stu1.number = 1;

    stu1.sex = @"man";

    

    [dataHandler insertStudent:stu1];


    //查詢所有數據

    NSMutableArray *arr = [dataHandler selectAll];

    NSLog(@"%@", arr);


    //刪除

    [dataHandler deleteStudentWithNumber:1];

    

    //關閉數據庫

    [dataHandler closeDB];

    

}







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章