数据库---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