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

  • 为啥用数据库
    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(@"成功");
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容