数据库---SQLite的知识整理

作者: 钎探穗 | 来源:发表于2016-06-27 20:30 被阅读369次
    • 为啥用数据库
      1:一款轻量级的嵌入式数据库(用于移动端)
      2:处理数据库的速度比MySql还要快
      3:SQLite不需要进行配置,这就意味着不需要安装和管理
      4:它是一个不需要单独服务器进行操作的系统
      5:SQLite是非常小的完全配置时小于400k,当省略一些可选文件时,小于250k
      6:SQLite自给自足的,也就意味着不需要任何的外部依赖

    • SQLite是如何存储的
      和excel很像,是以表(table)为单位进行存储

    ** 数据库的两大类:**

    • 关系型数据库(主流):关系型数据库是以行和列的形式存储数据,这种形式被称为表(二维表格),组成数据库.
     - 1.1:关系:可以理解为一张二维表,每一个关系都有一个关系名,也就是表名
     - 1.2:属性:可以理解为二维表中的一列,在数据库中称为字段
     - 1.3:元组:可以理解为二维表中的一行,在数据库中称为记录
     - 1.4:域:属性的取值范围,也就是数据库中,某一列的取值范围
     - 1.5:关键字:一组可以唯一标识元组的属性,数据库中称为主键.可以由一个或者多个列组成
    
    • 2:对象型数据库:把面向对象的方法和数据库技术结合起来,使得数据库系统的分析,设计尽可能最大程度的和人的思想,以及对世界的认识保持一致

    数据库的存储步骤

    1:新建一张表(table)
    2:添加多个字段(列,属性,column)
    3:增加多条记录(record,row:用于存放多个字段的对应值)

    **什么叫SQL**
    1:SQL(Structured  Query  Language)结构化查询语言
    2:是一种关系型数据库,对数据进行定义和操作(增删改查)的语言
    ---------------------------------------------------------------------------------
    **什么是SQL语句**
     1:用SQL语言编写的句子,代码
     2:在运行程序的过程中,要操作(增删改查:CRUD)数据库中的数据,必须使用SQL语句
    

    SQL语句特点:不区分大小写(eg:在数据库中user和UsEr是一样的)
    注意:每条语句必须用分号结束,不能用关键字来命名表和字段

    数据库中常用的关键字:select,inset,update,delete,where......


    SQL语句的种类:

    1. 数据定义语句(DDL: Data Definition Language):用来定义表的结构,包括create table(建表),drop table(删表)...
    2. 数据操作语句(DML:Data Manipulate Language):用来修改表内容,包括insert,delete,update......
    3. 数据查询语句(DQL:Data Query Language):用来查询表内数据,关键字是select(也是DQL中和所有SQL中用的最多的操作)

    这里我用的是创建单例类去调用的方法去实现数据的存储

    + (instancetype)shareDBHandle{
        if (dataBase == nil ) {
            dataBase = [[DBHandle alloc]init];
        }
        return  dataBase;
    
    }
    
    - (NSString *)path{
        if (_path == nil) {
            NSString *document = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject];
            //创建数据库文件
            _path = [document stringByAppendingString:@"/text.sqlite"];
           }
        return _path;
    }
    

    //创建一个数据库指针,好多地方都会使用到数据库,所以初始化一个数据库静态变量
    static sqlite3 *db= nil;

    //打开数据库
    - (void)openDB{
        NSLog(@"%@",self.path);
        /*
         用int接收打开结果,这里使用BOOL值
         sqlite3_open(<#const char *filename#>, <#sqlite3 **ppDb#>)
         参数1:文件名即数据库存储的路径
         参数2:两级指针即数据库的地址"&"
         */
        BOOL result = sqlite3_open(self.path.UTF8String, &db);
        if (result ==SQLITE_OK) {
            NSLog(@"数据库打开成功");
        }else{
            NSLog(@"数据库打开失败");
        
        }
    }
    
    //关闭数据库
    - (void)closeDB{
        BOOL result = sqlite3_close(db);
        if (result == SQLITE_OK) {
            NSLog(@"数据库关闭成功");
        }else{
            NSLog(@"数据库关闭失败");
        }
    
    }
    
    //建表
    - (void)SetCreat{
    //1:准备SQL语句,创建一个stu表
        NSString *sqlString = @"create table if not exists stu(s_id integer primary key  autoincrement not null, s_name text, s_age integer)";
        //执行SQL语句
        /*
         sqlite3_exec(<#sqlite3 *#>, <#const char *sql#>, <#int (*callback)(void *, int, char **, char **)#>, <#void *#>, <#char **errmsg#>)
         参数1:数据库
         参数2:将准备好的sql语句放置在此(转换成C语言格式)
         参数3:结果回调一个函数
         参数4:回调一个函数
         参数5:错误信息
         */
        
        int result = sqlite3_exec(db, sqlString.UTF8String, NULL, NULL, NULL);
        if (result == SQLITE_OK) {
            NSLog(@"建表成功");
        }else{
            NSLog(@"建表失败");
        }
    
    }
    
    //增(姓名,年龄)
    - (void)insertWithName:(NSString *)name age:(NSInteger)age{
    //1:准备sql语句,当values的值不确定时用?来代替,之后会对其进行绑定
        NSString *sqlString = @"insert into stu(s_name,s_age)values(?,?)";
        //2:创建伴随指针(用于绑定参数,获取数据)
        sqlite3_stmt *stmt = NULL;
        //3:预执行
        /*
         sqlite3_prepare(<#sqlite3 *db#>, <#const char *zSql#>, <#int nByte#>, <#sqlite3_stmt **ppStmt#>, <#const char **pzTail#>)
         参数1:数据库
         参数2:sql语句(转格式)
         参数3:有正负之分(正:代表只往后读一个字节.负:遇到特殊符号才会结束(\000,u000))
         参数4:伴随指针的地址
         参数5:表示取值时取不全,剩下的值全部存于此,一般给NULL
         
         */
        int result = sqlite3_prepare(db, sqlString.UTF8String, -1, &stmt, NULL);
        if (result == SQLITE_OK) {
            //4:绑定参数
            /*
              sqlite3_bind_text(<#sqlite3_stmt *#>, <#int#>, <#const char *#>, <#int#>, <#void (*)(void *)#>)
             参数1:伴随指针--绑定参数,获取数据
             参数2:[?的位置,从1开始]
             参数3:表示你要插入的值(转换格式---UTF8String)
             参数4:有正负之分(正:代表只往后读一个字节.负:遇到特殊符号才会结束(\000,u000))
             参数5:回调函数
             */
            sqlite3_bind_text(stmt, 1, name.UTF8String, -1, nil);
            sqlite3_bind_int64(stmt, 2, age);
            //5:sql语句执行完毕后,执行伴随指针,根据伴随指针的情况判断是否插入成功[SQLITE_DONE表示伴随指针执行数据成功]
            if (sqlite3_step(stmt) == SQLITE_DONE) {
                NSLog(@"插入成功");
            }else {
                NSLog( @"插入失败");
            }
        }
        else{
            NSLog(@"语句失败");
        }
        sqlite3_finalize(stmt);
    
    }
    
    
    //删(SID)
    - (void)deleteWithID:(NSInteger)SID{
    //1:准备sql语句
        NSString *sqlstring = [NSString stringWithFormat:@"delete from stu where s_id  = %ld",SID];
         //执行sql语句
        int result = sqlite3_exec(db, sqlstring.UTF8String, NULL, NULL, NULL);
        //结果
        if (result == SQLITE_OK) {
            NSLog(@"删除数据成功,%ld",SID);
        }else{
            NSLog(@"删除失败");
        }
    
    }
    
    
    //更新(age)
    - (void)upDataWithAge:(NSInteger)age{
    
    //1:准备sql语句
        NSString *sqlString = @"update stu set s_age = ? where s_age = 18";
        //2:创建伴随指针
        sqlite3_stmt *stmt = NULL;
        int result = sqlite3_prepare(db, sqlString.UTF8String, -1, &stmt, NULL);
        if (result == SQLITE_OK) {
            //3:参数绑定
            sqlite3_bind_int64(stmt, 1, age);
            //4:执行判断伴随指针是否绑定成功
            if (sqlite3_step(stmt) == SQLITE_DONE) {
                NSLog(@"更新成功");
            }else{
                NSLog(@"更新失败");
            }
        }
        else{
            NSLog(@"语句错误");
        }
        //5:释放伴随指针
        sqlite3_finalize(stmt);
    }
    
    //查找(name)
    - (void)selectWithName:(NSString *)name{
    //准备sql语句
    NSString *sqlString = @"select s_id,s_name,s_age from stu where s_name = ?";
        //伴随指针创建
        sqlite3_stmt *stmt = nil;
        //预执行
        int result = sqlite3_prepare(db, sqlString.UTF8String, -1, &stmt, NULL);
        if (result == SQLITE_OK) {
            sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);
            while (sqlite3_step(stmt) == SQLITE_ROW) {
                //从伴随指针获取数据(第0列)
                int s_id = sqlite3_column_int(stmt, 0);
                NSLog(@"s_id=====%d",s_id);
                //从伴随指针获取数据(第1列)
                NSString *s_name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
                NSLog(@"s_name=====%@",s_name);
                //从伴随指针获取数据(第2列)
                int s_age = sqlite3_column_int(stmt, 2);
                NSLog(@"s_age======%d",s_age);
                
            }
        }else{
            NSLog(@"语句错误");
        }
        sqlite3_finalize(stmt);
        
    }
    
    //清空数据
    - (void)clear;{
    //准备sql语句
        NSString *sqlstring = @"delete from stu";
        //执行
        sqlite3_exec(db, sqlstring.UTF8String, nil, NULL, NULL);
    
    }
    
    //清除表
    - (void)clearTable{
    NSString *sql = @"drop table if exists stu";
    BOOL result =  sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL);
        if (result == SQLITE_OK) {
            NSLog(@"成功");
        }
    }
    

    相关文章

      网友评论

      • 夏日的忧殇:写的有点乱而且有bug!
        钎探穗:@夏日的忧殇 谢谢,后期会修改
      • 142a9cf08006:很详细的直接对SQLite的使用,对于比较熟悉SQL的朋友值得推荐。
      • 钎探穗:嗯嗯,把想到的一点点整理下,
      • 春泥Fu:现在基本都用FMDB了吧~
        不过写得不错 :blush:

      本文标题:数据库---SQLite的知识整理

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