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的具体实例应用

文件结构

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

文件内容

DataBaseHandle.h文件

#import <Foundation/Foundation.h>
//第一步: 导入依赖库
//第二步: 引入头文件
#import <sqlite3.h>
@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

<h2> 实现数据库操作的方法</h2>

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

<h5> *返回数据库文件路径</h5>

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

<h5> *数据库指针</h5>

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

<h4> *打开数据库方法</h4>

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

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


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

<h4> * 关闭数据库方法</h4>

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

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

<h4> *建表 </h4>

//建表
- (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);
    }

}

<h4>* 增加记录(此处以姓名,年龄) </h4>

//增加记录(此处以姓名,年龄)
- (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);

}

<h4>* 删除记录(SID)</h4>

//删除记录(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);
    }

}

<h4> *更新数据(根据字段age)</h4>

//更新数据(根据字段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);

}

<h4>*查找数据(根据字典name)</h4>

//查找数据(根据字典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);
}

<h4>* 清除表内容 和删除数据库表</h4>

//清除表内容 和删除数据库表
- (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];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容