iOS數據持久化(二)SQLite

1、什麼是SQLitesql

  SQLite是一款輕型的嵌入式數據庫,它佔用資源很是的低,處理速度快,很是適合用於移動端開發。
2、使用
  建立DataBaseHandle.h   &    DataBaseHandle.m
  
DataBaseHandle.h
#import <Foundation/Foundation.h>
#import "Student.h"
@interface DataBaseHandle : NSObject
+ (DataBaseHandle *)shareDataBase;
- (void)openDB;
- (void)closeDB;
//添加數據
- (void)insertNewStudent:(Student *)student;
/**
 *  根據學號查詢學生
 */
- (Student *)selectStudentWithNumber:(NSInteger)number;
/**
 *  查詢表中全部數據
 */
- (NSMutableArray *)selectAllStudents;
/**
 *  根據學號刪除
 */
- (void)deleteStudentWithNumber:(NSInteger)number;
- (void)updateStudent:(NSString *)gender WithNumber:(NSInteger)number;
@end

 

DataBaseHandle.m數據庫

+ (DataBaseHandle *)shareDataBase {
    @synchronized (self){
        if (handle == nil) {
            handle = [[DataBaseHandle alloc] init];
            
//            [handle closeDB];
        }
    }
    return handle;
}
sqlite3 *db = nil;

  打開數據庫指針

- (void)openDB {
    NSString *str = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject];
    NSString *path = [str stringByAppendingPathComponent:@"student.sqlite"];
    NSLog(@"%@",path);
    //打開數據庫
    //UTF8String 將oc字符串轉化爲C語言字符串

    //方法執行完會返回一個數據庫對象,這個對象已被初始化
    int result = sqlite3_open([path UTF8String], &db);
    //若是等於SQLITE_OK說明sql語句執行成功
    if (result == SQLITE_OK) {
        NSLog(@"數據庫打開成功");
        //建立表格
        NSString *sqlString = @"create table if not exists Student (number integer primary key autoincrement,name text,gender text,age integer)";
          int result =  sqlite3_exec(db, [sqlString UTF8String], NULL, NULL, NULL);
        if (result == SQLITE_OK) {
            NSLog(@"見表成功");
        }
    } else {
        NSLog(@"數據庫打開失敗");
    }
}

  關閉數據庫sqlite

- (void)closeDB {
    int result = sqlite3_close(db);
    if (result == SQLITE_OK) {
        NSLog(@"關閉成功");
    }else {
        NSLog(@"關閉失敗");
    }
}

  插入數據對象

- (void)insertNewStudent:(Student *)student {
    [self openDB];
    //準備sql語句
    NSString *sqlString = @"insert into Student (name,gender, age) values (?, ?, ?)";
    /*第一個參數,數據庫指針,
     第二個參數,sql語句
     第三個參數,sql語句的長度,寫成-1,自動計算
     第四個參數,建立管理sql語句的類,statement
     第五個參數,預留參數
     */
    sqlite3_stmt *stmt = nil;
    int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"添加語句成功");
        //綁定參數
        //綁定的參數:1.管理類指針,2.第幾個問號,3.綁定的數據, 4.綁定數據的長度 -1   5.
        sqlite3_bind_text(stmt, 1, [student.name UTF8String], -1, NULL);
        sqlite3_bind_text(stmt, 2, [student.gender UTF8String], -1, NULL);
        sqlite3_bind_int(stmt, 3, (int)student.age);
        /**/
        sqlite3_step(stmt);
    } else {
        NSLog(@"添加語句失敗");
    }
    sqlite3_finalize(stmt);
    [self closeDB];
}

  查詢數據blog

- (NSMutableArray *)selectAllStudents {
    [self openDB];
    NSString *sqlString = @"select * from student";
    sqlite3_stmt *stmt = nil;
    int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, nil);
    if (result == SQLITE_OK) {
        NSLog(@"查詢所有成功");
        //循環的條件:下一行還有數據,這時就能一直循環下去
        NSMutableArray *array = [NSMutableArray arrayWithCapacity:0];
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
            NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];
            NSInteger age = sqlite3_column_int(stmt, 3);
            
            Student *stu = [[Student alloc] init];
            stu.name = name;
            stu.age = age;
            stu.gender = gender;
            [array addObject:stu];
            [stu release];
        }
        sqlite3_finalize(stmt);
        [self closeDB];

        return array;
    } else {
        NSLog(@"error");
        return nil;
    }
}

  

- (Student *)selectStudentWithNumber:(NSInteger)number {
    [self openDB];
    
    NSString *sqlString = @"select * from Student where number = ?";
    
    sqlite3_stmt *stmt = nil;
    int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"查詢成功");
        //綁定參數
        sqlite3_bind_int(stmt, 1, (int)number);
        
        Student *student = [[[Student alloc] init]autorelease];
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            student.name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
            student.gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];
            student.age = sqlite3_column_int(stmt, 3);
        }
        sqlite3_finalize(stmt);
        [self closeDB];
        return student;
        
    } else {
        NSLog(@"不OK");
        return nil;
    }
}

  刪除數據內存

- (void)deleteStudentWithNumber:(NSInteger)number {
    [self openDB];
    NSString *sqlString = @"delete from Student where number = ?";
    sqlite3_stmt *stmt = nil;
    int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL);
    if (result == SQLITE_OK) {
        sqlite3_bind_int(stmt, 1, (int)number);
        //執行sql語句
        sqlite3_step(stmt);
    }
    //釋放stmt的內存資源
    sqlite3_finalize(stmt);
    
    [self closeDB];
}

  修改數據ci

- (void)updateStudent:(NSString *)gender WithNumber:(NSInteger)number {
    [self openDB];
    
    NSString *sqlString = @"update Student set gender = ? where number = ?";
    sqlite3_stmt *stmt = nil;
    int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL);
    
    if (result == SQLITE_OK) {
        sqlite3_bind_int(stmt, 2, (int)number);
        
        sqlite3_step(stmt);
    }
    sqlite3_finalize(stmt);
    [self closeDB];
}
相關文章
相關標籤/搜索