SQLite数据库基本操作

1. SQLite数据库的特点:

  1. SQLite是一款轻量级的嵌入式数据库(用于移动端)
  2. 处理数据的速度, 比MySQL还要快
  3. SQLite不需要进行配置(只需要引入依赖库, 和头文件),这就意味着不需要安装
  4. SQLite的一个不需要单独服务器进行(维护)操作的系统, 是完全自己独立
  5. SQLite是非常小的, 完全配置时小于400K, 当省略一些可选文件时小于250K
  6. SQLite是自给自足的, 也就意味着不需要任何的外部依赖

2. SQLite数据库的基本操作

打开数据库格式 :      sqlite3_open(数据库路径.UTF8String, 指向数据库的地址的地址);
创建表格式:          create table 表名 ( 字段名1 字段类型  约束1 约束2 ,字段2  约束2);
插入数据(增)格式:     insert into 表名(name,age) values(‘大王',10); 
删除数据(删)格式:     delete from 表名 where 条件
修改数据(改)格式:     update  表名  set 字段名 = 值  where 条件字段 = 满足条件//修改的不仅仅是一条记录
查询数据(查)格式:     select 字段* from 表名 where 条件
关闭数据库格式:       sqlite3_close(数据库指针);

3. SQLite的具体实例应用

文件结构


  1. 单例类(DataBaseHandle)(工具类, 所有sqlite语句都封装到该类中, 在controller中用该类的对象调用数据库的基本操作(方法))
  2. controller类(ViewConteoller)(类中调用单例类, 并初始化一个单例类对象, 调用数据库操作方法)

文件内容

DataBaseHandle.h文件

#import 
//第一步: 导入依赖库
//第二步: 引入头文件
#import 
@interface DBHandle : NSObject
//初始化单例类对象的方法
+ (DBHandle*)shareDBHandle;
//打开数据库方法
- (void)openDB;
//关闭数据库方法
- (void)closeDB;
//建表
- (void)setCreate;
//增加记录(此处以姓名,年龄)
- (void)insertWithName:(NSString *)name age:(NSInteger)age;
//删除记录(SID)
- (void)deleteStudentByID:(NSInteger)SID;
//更新数据(根据字段age)
- (void)updateWithAge:(NSInteger)age;
//查找数据(根据字典name)
- (void)selectWithName:(NSString *)name;
//删除表
- (void)clearDB;
@end

DataBaseHandle.m文件
#import "DBHandle.h"
//创建代理对象
static DBHandle *dataBase = nil;
@interface DBHandle ()
//保存数据库路径
@property (nonatomic, copy)NSString *dataBasePath;
@end
@implementation DBHandle

实现数据库操作的方法

//初始化单例类对象的房    
+ (DBHandle *)shareDBHandle{
    if (dataBase == nil) {
        dataBase = [[DBHandle alloc] init];
    }
  return dataBase;
}

*返回数据库文件路径

- (NSString *)dataBasePath{  
if (_dataBasePath == nil) {
    //1. 获取数据库路径
    NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,         NSUserDomainMask, YES)firstObject];
    //2. 拼接数据库文件
    _dataBasePath = [documents stringByAppendingString:@"/student.sqlite"];
    }
    return _dataBasePath;
}

*数据库指针

//数据库指针: 因为好多地方都会使用到数据库, 所以初始化一个数据库静态变量
//创建数据库指针
static sqlite3 *db = nil;

*打开数据库方法

 //打开数据库方法
- (void)openDB{

    NSLog(@"databasePath = %@", self.dataBasePath);


    //定义一个BooL类型的数据, 用来接收打开数据库的结果
    //参数一: 数据库存储的路径 (c语言形式.UTF8String)
    //参数二: 数据库的地址 &
    BOOL result = sqlite3_open(self.dataBasePath.UTF8String, &db);
    if (result == SQLITE_OK) {
    
        NSLog(@"打开成功");
    }else{
    
        NSLog(@"打开失败");
    }
}

* 关闭数据库方法

//关闭数据库方法
- (void)closeDB{

    BOOL result = sqlite3_close(db);
    if (result == SQLITE_OK) {
    
        NSLog(@"关闭成功");
    }else{
    
        NSLog(@"关闭失败");
    }
}

*建表

//建表
- (void)setCreate{

    //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)";

    //2. 执行SQL语句
    //参数一:  数据库
    //参数二:  要执行的sql语句(要求转换成C语言的格式)
    //参数三:  表示结果回调一个函数
    //参数四:  回调一个函数参数
    //参数五:  错误信息
    int result = sqlite3_exec(db, sqlString.UTF8String, NULL, NULL, NULL);
    if (result == SQLITE_OK) {

        NSLog(@"创建表成功");
    }else{
    
        NSLog(@"创建表失败%d", result);
    }

}

* 增加记录(此处以姓名,年龄)

//增加记录(此处以姓名,年龄)
- (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. 预执行
    //参数一: 数据库
    //参数二: sql语句(C语言的格式, 所以需要进行转码:UTF8String)
    //参数三: 有正负之分(正: 代表只往后读一个字节. 负: 遇到特殊符号才会结束,例如:\000, u000) s_name = @"zhang\000san"
    //参数四: 伴随指针的地址
    //参数五: 表示取值的时候只取一部分, 剩余的部分会存储在这里

    int result = sqlite3_prepare(db, SQLString.UTF8String, -1, &stmt, NULL);

    if (result == SQLITE_OK) {
    
        NSLog(@"添加预处理成功");
        //4. 绑定参数
        //参数一: 伴随指针 -->用于绑定参数,获取数值
        //参数二: 绑定参数位置( "?" 的位置, 从1开始)
        //参数三: 表示要插入的值(形参),需要进行UTF8String转换
        //参数四: 有正负之分(正: 代表只往后读一个字节. 负: 遇到特殊符号才会结束,例如:\000, u000) s_name = @"zhang\000san"
        //参数五: 回调一个函数
        sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL); //对Name进行绑定
        sqlite3_bind_int64(stmt, 2, age);
    
        //5. 执行伴随指针(sql语句执行完毕后, 根据伴随指针的情况判断是否插入成功(SQLITE_DONE: 表示伴随指针执行数据成功))
        if (sqlite3_step(stmt) == SQLITE_DONE) {
        
            NSLog(@"插入成功");
        }else{
        
            NSLog(@"插入失败%d", result);
        }
    
    }else{
    
        NSLog(@"添加预处理失败%d", result);
    }

    //6. 释放伴随指针
    sqlite3_finalize(stmt);

//第二种方式:
    //NSString *SQLString = [NSString stringWithFormat:@"insert into stu(s_name, s_age) values('%@', %ld)",name, age];
    //int result = sqlite3_exec(db, SQLString.UTF8String, NULL, NULL, NULL);

}

* 删除记录(SID)

//删除记录(SID)
- (void)deleteStudentByID:(NSInteger)SID{

    //1. 准备SQL语句
    NSString *sqlString = [NSString stringWithFormat:@"delete from stu where s_id = %ld",SID];

    //2. 执行sql语句
int result = sqlite3_exec(db, sqlString.UTF8String, NULL, NULL, NULL);

    //3. 结果
    if (result == SQLITE_OK) {
    
        NSLog(@"删除数据成功%ld", SID);
    
    }else{
    
        NSLog(@"删除失败%d", result);
    }

}

*更新数据(根据字段age)

//更新数据(根据字段age)
- (void)updateWithAge:(NSInteger)age{

    //1. 准备SQL语句(无条件时, 不做更新)
    NSString *sqlString = @"update stu set s_age = ? where s_age = 18";

    //2. 创建伴随指针
    sqlite3_stmt *stmt = NULL;

    //3. 预执行
    int result = sqlite3_prepare(db, sqlString.UTF8String, -1, &stmt, NULL);

    if (result == SQLITE_OK) {
    
        NSLog(@"预处理成功");
        //4. 绑定参数
        sqlite3_bind_int64(stmt, 1, age);
    
        //5. 执行判断伴随指针是否绑定成功
        if (sqlite3_step(stmt) == SQLITE_DONE) {
        
            NSLog(@"更新成功");
        }else{
        
            NSLog(@"更新失败");
        }
    
    }else{
    
    NSLog(@"语句错误");
}

    //6. 释放伴随指针
    sqlite3_finalize(stmt);

//第二种方法:
    //NSString *sqlString = [NSString stringWithFormat:@"update stu set s_age = %ld where s_age = 20", age];

    //int result = sqlite3_exec(db, sqlString.UTF8String, NULL, NULL, NULL);

}

*查找数据(根据字典name)

//查找数据(根据字典name)
- (void)selectWithName:(NSString *)name{

    //1. 准备sql语句
    //NSString *sqlString = @"select * from stu where  s_name = ?";
    NSString *sqlString = [NSString stringWithFormat:@"select * from stu where s_name = '%@'", name]; //添加 单引号

    //2. 创建伴随指针
    sqlite3_stmt *stmt = nil;

    //3. 预执行
    int result = sqlite3_prepare(db, sqlString.UTF8String, -1, &stmt, NULL);

   if (result == SQLITE_OK) {
        
        //4. 绑定数据
       sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);
    
        while (sqlite3_step(stmt) == SQLITE_ROW) {
        
            //从伴随指针获取数据(第一列)
            int s_id = sqlite3_column_int(stmt, 0);
        
            //从伴随指针获取数据(第二列)
            NSString *s_name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
        
            //从伴随指针获取数据(第三列)
            int s_age = sqlite3_column_int(stmt, 2);
        
            NSLog(@"s_id = %d, s_name = %@, s_age = %d", s_id, s_name, s_age);   
        }

    }else{
    
          NSLog(@"查找失败%d", result);
    
    }

    //释放伴随指针
    sqlite3_finalize(stmt);
}

* 清除表内容 和删除数据库表

//清除表内容 和删除数据库表
- (void)clearDB{

    //1. 准备sql 语句
    NSString *sql = @"delete from stu";
    //删除表
    //NSString *sql = @"drop table stu";

    //2. 执行
    sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL); 
}
 @end

viewController.m文件

#import "DBHandle.h"
DBHandle *db = [DBHandle shareDBHandle]; 
//打开数据库
[db openDB];
//建表
[db setCreate];
//插入
[db insertWithName:@"帅哥" age:20];
//删除
//[db deleteStudentByID:1];
//更新
[db updateWithAge:10];
[db selectWithName:@"美女007"];
[db clearDB];
//关闭数据库
[db closeDB];

你可能感兴趣的:(SQLite数据库基本操作)