UISQLHanlder数据库的使用

作者: 无敌小阿铭 | 来源:发表于2016-07-02 14:53 被阅读68次

    数据库

    今天给大家分享ios数据库的应用😳
    说道数据库我们就要先说到单例,什么是单例呢???😳 你猜我猜不猜你猜不猜😂
    好了,说正事,单例是ios中常用的一种设计模式,单例变量,简单的说就是在整个应用程序声明周期内只能有一个实例对象,这个对象只初始化一次,恩!差不多就这意思。。。
    其实在ios程序开发中我们也有许多经常用到的单例。

    • 单例的例子:
      • [NSFileManager defaultManager];
      • [UIScreen mainScreen];
      • [UIApplication sharedApplication];
      • [NSOperationQueue mainQueue];
        说完单例我们接下来说说今天的主题,数据库。
        数据库在我们做项目的时候经常会用到,我们经常会把来自网络的数据存到本地的数据库中。
        代码部分:😳
    • 首先我们要简单的了解sql语句,我们只说最基础的几个要是想说的话太复杂了一时间说不完😳
      常用的sql语句有以下几个:
      创建表的语句:
    // create table 表名(数据名 数据类型 设置主键, 数据名 数据类型)
    create table student (id integer primary key, name text)
    

    插入数据的语句:

    // insert into 表名 values(上面创建表中数据按顺序给值)
    insert into student values(1,'大宝宝');
    

    删除数据的语句:

    // delete from 表名 where 条件
    delete from student where id = 1
    

    更改数据的语句

    update student set name='宇宙无敌超级大宝宝' where id=1
    

    查询语句

    // 查询表中的全部数据
    select *from student
    

    好,回到我们的开发代码当中

    • 创建一个数据库的类继承于NSObject 我这里命名为SQLHandler
    • 首先在SQLHandler.h文件中我们先搞些事情
    • 在SQLHandler.h文件中我们搞一个指针😳 并声明我们要用的方法详见代码
    @interface SQLHandler : NSObject
    {
        // 指向本地数据库的指针,保存的是数据库的内存地址.
        sqlite3 *DBPoint;
    }
    // 创建一个单例方法
    // 单例方法一般都是 + 方法
    +(SQLHandler *)shareInstance;
    
    // 打开数据库方法
    -(void)openDB;
    // 关闭数据库方法
    -(void)closeDB;
    // 创建表的方法
    -(void)createTable;
    // 修改数据的方法
    -(void)update;
    // 插入数据的方法
    -(void)insert:(Student *)stu;
    // 查询所有数据的方法
    -(NSArray *)selectedAll;
    
    • 然后到SQLHandler.m文件中搞事情😳
    • 创建一个单例方法
    +(SQLHandler *)shareInstance {
        // 1.单例方法第一次调用,就会创建一个静态的指针变量,起始置空
        static SQLHandler *handler = nil;
        // 2.如果判断为空,说明是第一次执行,就创建对象。
        //   如果不为空,说明已经执行过,不要创建对象,可以直接使用
        if (handler == nil) {
            handler = [[SQLHandler alloc] init];
        }
        return handler;
    }
    
    • 实现打开数据库的方法
    // 获得documents文件夹地址,创建数据库文件地址
        NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
        NSString *dbPath = [docPath stringByAppendingString:@"/test.db"];
        
        // 参数1:数据库保存地址
        // 参数2:数据库指针地址
        int result = sqlite3_open([dbPath UTF8String], &DBPoint);
        NSLog(@"%d", result);
        
        if (result == SQLITE_OK) {
            NSLog(@"数据库打开成功, %@", dbPath);
        } else {
            NSLog(@"数据库打开失败");
            
        }
    
    • 实现关闭数据库的方法
    -(void)closeDB {
        
        int result = sqlite3_close(DBPoint);
        
        if (result == SQLITE_OK) {
            NSLog(@"数据库关闭成功");
        } else {
            NSLog(@"数据库关闭失败");
        }
    }
    
    • 实现创建表的方法
    -(void)createTable {
        
        // 创建表
        // 写sql语句
        NSString *sql = [NSString stringWithFormat:@"create table student (id integer primary key, name text)"];
        // 参数1:数据库指针地址
        // 参数2:sql语句
        int result = sqlite3_exec(DBPoint, [sql UTF8String], NULL, NULL, NULL);
        if (result == SQLITE_OK) {
            NSLog(@"创建表成功");
        } else {
            
            NSLog(@"创建表失败");
        }
        
    }
    
    • 实现插入数据的方法
    -(void)insert:(Student *)stu {
        
        NSString *sql = [NSString stringWithFormat:@"insert into student values(%ld, '%@')", stu.Id, stu.name];
        int result = sqlite3_exec(DBPoint, [sql UTF8String], NULL, NULL, NULL);
        if (result == SQLITE_OK) {
            NSLog(@"插入成功");
        } else {
            
            NSLog(@"插入失败");
        }
        
    }
    
    • 实现删除数据的方法
    -(void)delete {
        
        NSString *sql = [NSString stringWithFormat:@"delete from student where id=1"];
        
        int result = sqlite3_exec(DBPoint, [sql UTF8String], NULL, NULL, NULL);
        if (result == SQLITE_OK) {
            NSLog(@"删除成功");
        } else {
            NSLog(@"删除失败");
        }
        
    }
    
    • 实现更改数据的方法
    -(void)update {
        
        
        NSString *sql = [NSString stringWithFormat:@"update student set name='大宝宝' where id=2"];
        
        int result = sqlite3_exec(DBPoint, [sql UTF8String], NULL, NULL, NULL);
        if (result == SQLITE_OK) {
            NSLog(@"更新成功");
        } else {
            
            NSLog(@"更新失败");
        }
        
    }
    
    • 重点:实现查询方法,需要创建一个student类属性为数据库中要存的数据
    -(NSArray *)selectedAll {
        
        // 1.创建一个状态指针
        // stmt相当于一个临时数据库,负责暂时保存sql执行的结果。在结束时集中对数据库进行写入
        sqlite3_stmt *stmt = nil;
        
        // 2.sql语句
        NSString *sql = @"select * from student";
        
        // 3.执行sql语句,检查sql格式,将结果保存到stmt指针中
        
        // 参数3:sql语句的长度限制,-1为不限制
        // 参数4:stmt指针的地址
        int result = sqlite3_prepare_v2(DBPoint, [sql UTF8String], -1, &stmt, NULL);
        
        // 创建一个空数组,为了稍后添加student对象
        NSMutableArray *stuArr = [NSMutableArray array];
        
        if (result == SQLITE_OK) {
            
            // sqlite3_step 每次执行都取出一行数据,直到最后一条数据为止。
            while (sqlite3_step(stmt) == SQLITE_ROW) {
                
                // 对每一行的数据进行分解,获取
                
                // 按列获取数据
                int Id = sqlite3_column_int(stmt, 0);
                
                const unsigned char *name = sqlite3_column_text(stmt, 1);
                
                // 使用上面的数据创建爱你student对象,放到数组中
                Student *stu = [[Student alloc] init];
                stu.Id = Id;
                stu.name = [NSString stringWithUTF8String:(char *)name];
                
                [stuArr addObject:stu];
            }
            
        }
        
        // 销毁stmt指针,回收内存,将变化写入本地数据库
        sqlite3_finalize(stmt);
        
        return [NSArray arrayWithArray:stuArr];
        
    }
    

    😳OK在SQLHanlder文件中搞完事情后我们就可以去我们的.ViewControll里去用我们的SQLHanlder类去调用我们的单例方法了,想其他的单例一样:[SQLHanlder shareInstance]

    想要执行操作数据库只要调用方法就行了:

        [[SQLHandler shareInstance] openDB];
        
        [[SQLHandler shareInstance] createTable];
        
        Student *stu1 = [[Student alloc] init];
        stu1.name = @"宝宝";
        stu1.Id = 1;
        [[SQLHandler shareInstance] insert:stu1];
        
        Student *stu2 = [[Student alloc] init];
        stu2.name = @"大宝宝";
        stu2.Id = 2;
        [[SQLHandler shareInstance] insert:stu2];
        
        NSLog(@"%@", [[SQLHandler shareInstance]selectedAll]);
        
        
        [[SQLHandler shareInstance] update];
    

    关于数据库的代码最基础的就这些了,希望能对宝宝们有一些帮助,本宝宝是程序猿一枚,想交流知识随时可以找我😳 本宝宝随时奉陪

    相关文章

      网友评论

        本文标题:UISQLHanlder数据库的使用

        本文链接:https://www.haomeiwen.com/subject/rljqjttx.html