- 为啥用数据库
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语句的种类:
- 数据定义语句(DDL: Data Definition Language):用来定义表的结构,包括create table(建表),drop table(删表)...
- 数据操作语句(DML:Data Manipulate Language):用来修改表内容,包括insert,delete,update......
- 数据查询语句(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(@"成功");
}
}