ios数据库

#import <Foundation/Foundation.h>
#import <sqlite3.h>
#import "Student.h"
@interface DataBaseHandler : NSObject

{
    // 添加一个成员变量  作用:指向本地的数据库文件,方便我们进行读写操作
    sqlite3 *dbPoint;
}

// 把这个数据库处理类 写成一个单例

// 单例方法的写法:  单例永远不会被释放 不可被改变

// 1. 类方法(+)

+(DataBaseHandler *)shareInstance;

// 数据库的一些相关方法声明

//打开数据库
- (void)openDB;

// 关闭数据库
- (void)closeDB;

// 创建表
- (void)createTable;

//insert
-(void)insertStudent:(Student *)student;

- (NSMutableArray *)selectAll;
@end



#import "DataBaseHandler.h"
@implementation DataBaseHandler

// 类方法的实现
+ (DataBaseHandler *)shareInstance
{
    //创建一个静态指针, 只走一次这行代码
    static DataBaseHandler *dataBase = nil;
    
    if(dataBase == nil) {
        // 如果指针为空, 说明这是第一次执行
        dataBase = [[DataBaseHandler alloc] init];
    }
    return dataBase;
}
- (void)openDB
{
    // 打开数据库
    
    // 相关函数
    
    // 获取沙盒中documents文件夹
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    
    // 拼接一个数据库文件路径
    NSString *dbPath = [docPath stringByAppendingPathComponent:@"suibian.db"];
    NSLog(@"%@", dbPath);
    
    // 参数1: 数据库文件路径[dbPath UTF8String] 将oc字符串转为c的字符串;
    // 参数2: 数据库的指针地址
    // 作用: 1.去找文件路径下有没有相应的文件
    //      2. 如果没有,创建一个数据库文件,打开
    //     3. 如果有打开
    int result = sqlite3_open([dbPath UTF8String], &dbPoint);
    NSLog(@"结果: %d", result);
}

- (void)closeDB
{
    // 关闭数据库
    sqlite3_close(dbPoint);
}
- (void)createTable
{
    // 创建一个表
    // 执行sql语句的函数
    // 参数1:数据库指针
    // 参数2:sql语句
    // 参数3: 回调函数
    
    NSString *sql = @"create table student (name text,number integer primary key, sex text)";
    
   int result = sqlite3_exec(dbPoint, [sql UTF8String], NULL, NULL, NULL);
    NSLog(@"结果: %d", result);
}
- (void)insertStudent:(Student *)student
{
    NSString *sql = [NSString stringWithFormat:@"insert into student values (‘%@‘, %d, ‘%@‘)", student.name, student.number, student.sex];
    int result = sqlite3_exec(dbPoint, [sql UTF8String], NULL, NULL, NULL);
    NSLog(@"%d", result);
}

-(NSMutableArray *)selectAll
{
    // 搜索所有学生
    
    NSMutableArray *allStu = [NSMutableArray array];
    
    NSString *sql = @"select * from student";
    
    // 1.设置一个数据库替身 也就是一个临时数据库 作用: 你对数据库的所有操作都暂时保存到替身中, 确认无误后,系统自动写到本地数据库
    sqlite3_stmt *stmt = nil;
    
    // 2.确认sql语句的重要性
    // 参数1: 数据库指针
    // 参数2: SQL语句
    // 参数3: 控制sql的长度(-1:不控制长度)
    // 参数4: 替身
    
    // 作用:  1.检查sql语句的正却行
    //       2.指定stmt为数据库的替身
    int result = sqlite3_prepare_v2(dbPoint, [sql UTF8String], -1, &stmt, NULL);
    if(result == 0) {
        // sql确认无误,执行sql语句
        while (sqlite3_step(stmt) == 0) {
            // 如果数据库中有符合搜索条件的一行, 就进入while循环体
            
            // 按照列, 取得相应的值
            // 获取第一列的值
            // 参数1: 替身
            // 参数2: 第几列
            const unsigned char* nameChar = sqlite3_column_text(stmt, 0);
            NSString *name = [NSString stringWithUTF8String:(const char*)nameChar];
            
            //获取第二列的值
            int number = sqlite3_column_int(stmt, 1);
            
            // 获取第三列的值
            NSString *sex = [NSString stringWithUTF8String:(const char*)sqlite3_column_text(stmt,  2)];
            
            Student *stu = [[Student alloc] init];
            stu.name = name;
            stu.number = number;
            stu.sex = sex;
            
            [allStu addObject:stu];
            [stu release];
        }
    }
    // 将替身中的所有数据操作都写到本地数据库, 销毁替身;
    sqlite3_finalize(stmt);
    
    return allStu;
}


@end

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。