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