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字段作为主键,相当于人的身份证
主键可以是一个字段或多个字段

你可能感兴趣的:(iOS SQLite使用简介)