iOS SQLite使用简介

1、什么是SQLite

SQLite是一款轻型的嵌入式数据库
它占用资源非常低,在嵌入式设备中,可能只需要几百K的内存就够了
它的处理速度比MySQL、PostgreSQL这两款著名的数据库都还快

2、什么是数据库

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库
数据库可以分为2大种类:
(1)关系型数据库(主流)
(2)对象型数据库

3.如何存储数据

数据库的存储结构和excel很像,以表(table)为单位,一般步骤是:
(1)新建一张表(table)
(2)添加多个字段(column, 列, 属性)
(3)添加多行记录(row, 每行存放多个字段对应的值)

4.SQLite语句的特点及其关键字:

特点:
(1) 不区分大小写(比如数据库认为user和UsEr是一样的)
(2)每条语句都必须以分号 ‘; ’结尾

常用的关键字:
select、insert、update、delete、from、create、where、desc、order、by、group、table、alter、view、index等等
注:数据库中不可以使用关键字来命名表、字段

下面就通过代码讲解SQLite的使用

1)打开数据库
- (void)openSqlite{
    //1.打开数据库(如果指定的数据库文件存在就直接打开,不存在就创建一个新的数据文件)
    //参数1:需要打开的数据库文件路径(iOS中一般将数据库文件放到沙盒目录下的Documents下)
    NSString *nsPath = [NSString stringWithFormat:@"%@/Documents/Person.db", NSHomeDirectory()];
    const char *path = [nsPath UTF8String];
  
  //参数2:指向数据库变量的指针的地址
    //返回值:数据库操作结果
     int ret = sqlite3_open(path, &_db);
    
    //判断执行结果
    if (ret == SQLITE_OK) { 
        NSLog(@"打开数据库成功");
    }else{
        NSLog(@"打开数据库失败");
    }
}
2)创建表格

格式:
create table 表名 (字段名1 字段类型1, 字段名2 字段类型2, …) ;
create table if not exists 表名 (字段名1 字段类型1, 字段名2 字段类型2, …) ;

- (void)creatTable{
    //1.设计创建表的sql语句
    const char * sql = "CREATE TABLE IF NOT EXISTS t_Student(id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, score real DEFAULT 0, sex text DEFAULT '不明');";
    
    //2.执行sql语句
    //通过sqlite3_exec方法可以执行创建表、数据的插入、数据的删除以及数据的更新操作;但是数据查询的sql语句不能使用这个方法来执行
    //参数1:数据库指针(需要操作的数据库)
    //参数2:需要执行的sql语句
    //返回值:执行结果
    int ret = sqlite3_exec(_db, sql, NULL, NULL, NULL);
    
    //3.判断执行结果
    if (ret == SQLITE_OK) {
        NSLog(@"创建表成功");
    }else{    
        NSLog(@"创建表失败");
    }
}
SQLite将数据划分为以下几种存储类型:
integer:整型值
real:浮点值
text:文本字符串
blob:二进制数据(比如文件)
注:实际上Sqlite是无类型的,就算声明为integer类型,还是能存储字符串文本(主键除外)
即建表时声明啥类型或者不声明类型都可以,但是为了保持良好的编程规范、方便程序猿之间交流,
编写建表语句的时候最好都加上每个字段的具体类型
3)删除表格

格式:
drop table 表名 ;
drop table if exists 表名 ;

- (void)deleteTable {
    const char *sql = "DROP TABLE if EXISTS t_Student;";
    int ret = sqlite3_exec(_db, sql, NULL, NULL, NULL);
    if (ret == SQLITE_OK) {
        NSLog(@"删除表格成功");
    } else {
        NSLog(@"删除表格失败");
    }
}
4)插入数据

格式:
insert into 表名 (字段1, 字段2, …) values (字段1的值, 字段2的值, …) ;

- (void)insertData{
    //1.创建插入数据的sql语句
    //===========插入单条数据=========
    const char * sql = "INSERT INTO t_Student (name,score,sex) VALUES ('小明',65,'男');";
    
    //==========同时插入多条数据=======
    NSMutableString * mstr = [NSMutableString string];
    for (int i = 0; i < 50; i++) {
        NSString * name = [NSString stringWithFormat:@"name%d", i];
        CGFloat score = arc4random() % 101 * 1.0;
        NSString * sex = arc4random() % 2 == 0 ? @"男" : @"女";
        NSString * tsql = [NSString stringWithFormat:@"INSERT INTO t_Student (name,score,sex) VALUES ('%@',%f,'%@');", name, score, sex];
        [mstr appendString:tsql];
    }
    //将OC字符串转换成C语言的字符串
    sql = mstr.UTF8String;
    //2.执行sql语句
    int ret = sqlite3_exec(_db, sql, NULL, NULL, NULL);
    //3.判断执行结果
    if (ret==SQLITE_OK) {
        NSLog(@"插入成功");
    }else{
        NSLog(@"插入失败");
    }
}
5)删除数据

格式:
delete from 表名 ;注:删除的是表中的所有记录
可以添加条件语句,选择性的删除

条件语句常见格式:
where 字段 = 某个值 ; if(字段==某个值) // 不能用两个 =
where 字段 is 某个值 ; // is 相当于 =
where 字段 != 某个值 ;
where 字段 is not 某个值 ; // is not 相当于 !=
where 字段 > 某个值 ;
where 字段1 = 某个值 and 字段2 > 某个值 ; // and相当于C语言中的 &&
where 字段1 = 某个值 or 字段2 = 某个值 ; // or 相当于C语言中的 ||

- (void)deleteData{
    //1.创建删除数据的sql语句
    const char * sql = "DELETE FROM t_Student WHERE score < 10;";
    
    //2.执行sql语句
    int ret = sqlite3_exec(_db, sql, NULL, NULL, NULL);
    
    //3.判断执行结果
    if (ret == SQLITE_OK) {
        NSLog(@"删除成功");
    }else{
        NSLog(@"删除失败");
    }
}
6)更新数据

格式:update 表名 set 字段1 = 字段1的新值, 字段2 = 字段2的新值, … ;

7)查询数据

格式:SELECT 字段1,字段2 FROM 表明;

- (void)selectData{
    //1.创建数据查询的sql语句
    const char * sql = "SELECT name,score FROM t_Student;";
    
    //2.执行sql语句
    //参数1:数据库
    //参数2:sql语句
    //参数3:sql语句的长度(-1自动计算)
    //参数4:结果集(用来收集查询结果)
    sqlite3_stmt * stmt;
    //参数5:NULL
    //返回值:执行结果
    int ret = sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL);
    if (ret == SQLITE_OK) {
        NSLog(@"查询成功");
        //遍历结果集拿到查询到的数据
        //sqlite3_step获取结果集中的数据
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            //参数1:结果集
            //参数2:列数
           const unsigned char * name = sqlite3_column_text(stmt, 0);
            double score = sqlite3_column_double(stmt, 1);
            NSLog(@"%s %.2lf", name, score);
        }
    }else{
        NSLog(@"查询失败");
    }
}
8)其他功能
起别名:
select 字段1 别名 , 字段2 别名 , … from 表名 别名 ; 
select 字段1 别名, 字段2 as 别名, … from 表名 as 别名 ;
select 别名.字段1, 别名.字段2, … from 表名 别名 ;
计算记录的数量
select count (字段) from 表名 ;
select count ( * ) from 表名 ;
查询出来的结果可以用order by进行排序
select * from t_student order by 字段 ;
select * from t_student order by age ;

默认是按照升序排序(由小到大),也可以变为降序(由大到小)
select * from t_student order by age desc ;  //降序
select * from t_student order by age asc ;   // 升序(默认)

也可以用多个字段进行排序
select * from t_student order by age asc, height desc ;
先按照年龄排序(升序),年龄相等就按照身高排序(降序)
使用limit可以精确地控制查询结果的数量,比如每次只查询10条数据
格式: select * from 表名 limit 数值1, 数值2 ;
示例:
select * from t_student limit 4, 8 ;
可以理解为:跳过最前面4条语句,然后取8条记录
建表时可以给特定的字段设置一些约束条件,常见的约束有
not null :规定字段的值不能为null
unique :规定字段的值必须唯一
default :指定字段的默认值
(建议:尽量给字段设定严格的约束,以保证数据的规范性)
主键约束:
良好的数据库编程规范应该要保证每条记录的唯一性,为此,增加了主键约束
也就是说,每张表都必须有一个主键,用来标识记录的唯一性

什么是主键
主键(Primary Key,简称PK)用来唯一地标识某一条记录
例如t_student可以增加一个id字段作为主键,相当于人的身份证
主键可以是一个字段或多个字段
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容