iOS基础教程-SQLite数据库操作(二简单实例学生信息增删改查数据库操作)

2023-10-27

学生名单管理界面实现数据库的增删改操作

关于UI部分,我们使用storyboard简单完成,在上一篇文章中有详细的描述iOS基础教程-SQLite数据库操作(一 StoryBoard操作 SQLite操作前准备工作),本篇结束以后,就可以完成一个利用SQLite进行数据库操作的小Demo示例。

数据库操作最基本的无非就是增加,删除,改动,查询四个功能
这里写图片描述

修改数据分为下图中的几个步骤
这里写图片描述

第一步 sqlite3_open 打开数据库
第二步 sqlite3_prepare_v2 预处理 SQL 语句操作
第三步 sqlite3_bind_text 函数绑定参数
第四步 sqlite3_step 函数执行 SQL 语句
第五步 sqlite3_finalize 和 sqlite3_close 释放资源

我们新建一个SQLManager的管理类,把所有基本数据库操作的方法进行封装处理。下图是Demo工程的全部文件。
这里写图片描述

以下是代码部分:

SQLManager.h文件

#import <Foundation/Foundation.h>
#import "sqlite3.h"
#import "StudentModel.h"

@interface SQLManager : NSObject{

    sqlite3 * db;
}

+(SQLManager *)shareManager;

//查询
- (StudentModel *)searchWithIDNum:(StudentModel *)model;

//插入
-(int)insert:(StudentModel *)model;

//删除
-(void)remove:(StudentModel *)model;

//修改
-(void)modify:(StudentModel *)model;

@end

SQLManager.m文件

#import "SQLManager.h"

@implementation SQLManager

//定义宏的目的在于:我们操作数据库就相当于对本地文件的一个处理,首先要获取文件路径,去拼接它的名字,所以为了方便以后我们调用这个文件,先把文件名取好
#define kNameFile (@"Student.sqlite")

//创建单例
static SQLManager * manager = nil;

+(SQLManager *)shareManager{

    static dispatch_once_t once;
    dispatch_once(&once,^{

        manager = [[self alloc] init];
        [manager createDataBaseTableIfNeeded];
    });
    return manager;
}

//获取数据库的完整路径
-(NSString *)applicationDocumentsDirectoryFile{

    NSArray * paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString * documentDirectory = [paths firstObject];
    NSString * filePath = [documentDirectory stringByAppendingPathComponent:kNameFile];
    return filePath;
}

//再定义一个函数,接下来的操作是创建数据库,在进行数据库操作之前,确保数据库存在,不存在的时候必须要进行创建
- (void)createDataBaseTableIfNeeded{

    //虽然说我们的数据库是SQLite内置了,但是仍属于第三方,开发时如果想要使用它的类库,需要再进行配置添加
    //NameList配置文件-> TARGETS -> General -> LinkedFrameworks and Libraries,点击+号,搜书sqlit,选择libsqlite3.tbd。然后才能继续后续的操作。
    NSString * writetablePath =[self applicationDocumentsDirectoryFile];
    NSLog(@"数据库的地址是:%@",writetablePath);

    //打开数据库

    //第一个参数数据库文件所在的完整路径
    //第二个参数是数据库 DataBase 对象
    if (sqlite3_open([writetablePath UTF8String], &db) != SQLITE_OK) {

        //SQLITE_OK 是苹果为我们定义的一个常量如果是OK的话,就代表我们的数据库打开是成功了

        //失败
        //数据库关闭
        sqlite3_close(db);
        NSAssert(NO, @"数据库打开失败!");//抛出错误信息

    }else{

        //成功
        char * err;
        NSString * createSQL =[NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS StudentName (idNum TEXT PRIMARYKEY, name TEXT);"];
        //SQLite的执行函数
        /*
         第一个参数 db对象
         第二个参数 语句
         第三个和第四个参数 回调函数和回调函数参数
         第五个参数 是一个错误信息
         */
        if (sqlite3_exec(db, [createSQL UTF8String], NULL, NULL, &err) !=SQLITE_OK) {

            //失败
            //数据库关闭
            sqlite3_close(db);
            NSAssert1(NO, @"建表失败!%s", err);//抛出错误信息
        }
        sqlite3_close(db);
    }

}

//查询数据
/*
 1.使用sqlite3_prepare_v2函数预处理SQL语句
 2.使用sqlite3_bind_text函数绑定参数
 3.使用sqlite3_step函数执行SQL语句,遍历结果集
 4.使用sqlite3_column_text等函数提取字段数据
 */
- (StudentModel *)searchWithIDNum:(StudentModel *)model{

    NSString * path =[self applicationDocumentsDirectoryFile];
    if (sqlite3_open([path UTF8String], &db) != SQLITE_OK) {

        sqlite3_close(db);
        NSAssert(NO, @"打开数据库失败!");

    }else{

        NSString * qsql =@"SELECT idNum,name FROM StudentName where idNum = ?";
        sqlite3_stmt * statement;//语句对象

        //第一个参数:数据库对象
        //第二个参数:SQL语句
        //第三个参数:执行语句的长度 -1是指全部长度
        //第四个参数:语句对象
        //第五个参数:没有执行的语句部分 NULL

        //预处理
        if(sqlite3_prepare_v2(db, [qsql UTF8String], -1, &statement, NULL) ==SQLITE_OK){


            //进行 按主键查询数据库
            NSString * idNum = model.idNum;
            //第一个参数 语句对象
            //第二个参数 参数开始执行的序号
            //第三个参数 我们要绑定的值
            //第四个参数 绑定的字符串的长度
            //第五个参数 指针 NULL

            //绑定
            sqlite3_bind_text(statement, 1, [idNum UTF8String], -1, NULL);

            //遍历结果集
            /*
             有一个返回值 SQLITE_ROW常量代表查出来了
             */
            if (sqlite3_step(statement) == SQLITE_ROW) {

                //提取数据
                /*
                 第一个:语句对象
                 第二个:字段的索引
                 */
                char * idNum = (char *)sqlite3_column_text(statement, 0);
                //数据转化
                NSString * idNumStr =[[NSString alloc]initWithUTF8String:idNum];

                char * name =(char *)sqlite3_column_text(statement, 1);
                NSString * nameStr =[[NSString alloc]initWithUTF8String:name];


                StudentModel * model =[[StudentModel alloc] init];
                model.idNum = idNumStr;
                model.name = nameStr;

                //释放
                sqlite3_finalize(statement);
                sqlite3_close(db);
                return model;
            }
        }
        sqlite3_finalize(statement);
        sqlite3_close(db);
    }
    return nil;
}

//修改
-(int)insert:(StudentModel *)model{

    NSString * path =[self applicationDocumentsDirectoryFile];
    if (sqlite3_open([path UTF8String], &db) != SQLITE_OK) {
        sqlite3_close(db);
        NSAssert(NO, @"数据库打开失败!");
    }else{

        NSString * sql =@"INSERT OR REPLACE INTO StudentName (idNum, name) VALUES (?,?)";
        sqlite3_stmt * statement;
        //预处理过程
        if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, NULL) ==SQLITE_OK) {

            sqlite3_bind_text(statement, 1, [model.idNum UTF8String], -1, NULL);
            sqlite3_bind_text(statement, 2, [model.name UTF8String], -1, NULL);

            if (sqlite3_step(statement) != SQLITE_DONE) {

                NSAssert(NO, @"插入数据失败!");

            }
            sqlite3_finalize(statement);
            sqlite3_close(db);
        }

    }
    return 0;
}

//删除
-(void)remove:(StudentModel *)model{

    /*
     第一步 sqlite3_open 打开数据库
     第二步 sqlite3_prepare_v2 预处理 SQL 语句操作
     第三步 sqlite3_bind_text 函数绑定参数
     第四步 sqlite3_step 函数执行 SQL 语句
     第五步 sqlite3_finalize 和 sqlite3_close 释放资源
     */
     NSString * path =[self applicationDocumentsDirectoryFile];
    if (sqlite3_open([path UTF8String], &db) != SQLITE_OK) {

        sqlite3_close(db);
        NSAssert(NO, @"数据库打开失败");
    }else{

        NSString * sql =@"DELETE FROM StudentName where idNum = ?";
        sqlite3_stmt * statement;
        //预处理
        if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, NULL) ==SQLITE_OK) {

            sqlite3_bind_text(statement, 1, [model.idNum UTF8String], -1, NULL);
            sqlite3_bind_text(statement, 2, [model.name UTF8String], -1, NULL);
            if (sqlite3_step(statement) != SQLITE_DONE) {

                NSAssert(NO, @"删除数据失败!");
            }
            sqlite3_finalize(statement);
            sqlite3_close(db);
        }
    }

}

StudentModel.h文件

#import <Foundation/Foundation.h>

@interface StudentModel : NSObject

@property(nonatomic,strong)NSString * idNum;//学号
@property(nonatomic,strong)NSString * name; //学生姓名
@end

HomeViewController.m文件

#import "HomeViewController.h"
#import "StudentModel.h"
#import "SQLManager.h"

@interface HomeViewController ()

@property (nonatomic,strong) NSMutableArray * studentArray; //数据源 —— 模型

@end

#define HomeCellIdentifier (@"StudentCell")

@implementation HomeViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.studentArray =[[NSMutableArray alloc]init];
    NSLog(@"%@",self.studentArray);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];

}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    if (self.studentArray.count >0) {

         return self.studentArray.count;
    }else{

        return 1;
    }
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:HomeCellIdentifier forIndexPath:indexPath];

    //等待给cell赋值
    if(self.studentArray.count > 0){

        StudentModel * model =[self.studentArray objectAtIndex:indexPath.row];
        cell.textLabel.text = model.name;
        cell.detailTextLabel.text = model.idNum;
    }
    return cell;
}


- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    //支持编辑
    return YES;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

    return 50;
}

-(IBAction)addUserDone:(UIStoryboardSegue *)sender{

    StudentModel * model =[[StudentModel alloc]init];
    model.idNum = @"100";
    StudentModel * result = [[SQLManager shareManager] searchWithIDNum:model];
    NSLog(@"%@",result);
    [self.studentArray addObject:result];
    [self.tableView reloadData];
}

AddViewController.h文件

#import <UIKit/UIKit.h>

@interface AddViewController : UIViewController
@property (weak, nonatomic) IBOutlet UITextField *idNumTextField;
@property (weak, nonatomic) IBOutlet UITextField *nameTextField;

@end

AddViewController.m文件

#import "AddViewController.h"
#import "SQLManager.h"
#import "StudentModel.h"

@interface AddViewController ()

@end

@implementation AddViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

    if ([segue.identifier isEqualToString:@"AddUser"]) {

        //写入数据库
        StudentModel * model =[[StudentModel alloc]init];
        model.idNum = self.idNumTextField.text;
        model.name = self.nameTextField.text;

        [[SQLManager shareManager] insert:model];
    }
}
@end

完结。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS基础教程-SQLite数据库操作(二简单实例学生信息增删改查数据库操作) 的相关文章

随机推荐

  • 斐波那契序列与黄金分割比

    Fibonacci Sequence 0 1 1 2 3 5 8 13 21 34 55 fib 0 1 1 2 3 5 8 13 21 34 55 斐波那契递推公式 Python打印斐波那契递增序列 方法一 模拟 n int input
  • qt发布后 mysql数据库_QT连接MySql数据库,以及配置git上传到github

    前言 最近想把自己写的一个C 项目结合所学的Qt mysql结合起来进行完善 前期的一些准备工作记录如下 如有侵权 请联系删除 QT下载链接 我的下载版本为5 9 MySql下载链接 我的下载版本为5 7 MySql的安装配置 1 解压 这
  • ElasticSearch操作命令大全

    创建索引和映射 1 手动创建索引 curl XPUT localhost 9200 new index 2 获取映射 curl localhost 9200 get together mapping group pretty 定义新映射 c
  • 机器学习——线性回归与决策树实验(附效果以及完整代码)(数据集、测试集开源)

    机器学习实验 实验名称 实验一 线性回归与决策树 一 实验目的 1 掌握线性回归算法和决策树算法 ID3 的原理 2 学会线性回归算法和决策树算法 ID3 的实现和使用方法 二 实验内容 本次实验为第一次实验 要求完成本次实验所有内容 具体
  • 接口文档参考示例

    接口文档参考示例 用户登录 POST api login 接口说明 登录成功后 会生成或更新用户令牌 token 使用帮助 测试数据库中预设了四个可供使用的账号 如下表所示 Untitled 请求参数 Untitled 响应信息 登录成功
  • 湖南株洲三维扫描检测CNC机加工零件截面检测弧度测量-CASAIM中科广电

    自工业时代开始以来 机械加工及零部件产业已经涵盖了各大电器零部件 汽车零部件 建筑机械零部件 航空航天零部件 海洋工程零部件等领域 涉及多种机械机床及工具仪器的制造 零件在加工过程中 受制于加工工艺等各方面的因素 难免会产生加工误差 会直接
  • Ubuntu系统中使用VSCode(Visual Studio Code)

    一 软件下载安装 去官网下载文件 https code visualstudio com docs dv linux64 也可以用ubuntu自带的软件商店下载 本帖就采用这种方法 案例采用ubuntu16 04 操作如下图 首先单击APP
  • maven 项目 junit步骤。

    pom xml添加对应的jar包
  • 自动化测试的转行

    什么是自动化测 做测试好几年了 真正学习和实践自动化测试一年 自我感觉这一个年中收获许多 一直想动笔写一篇文章分享自动化测试实践中的一些经验 终于决定花点时间来做这件事儿 首先理清自动化测试的概念 广义上来讲 自动化包括一切通过工具 程序
  • CSS——层级

    层级问题 选中的盒子显示的效果并不完整 右边的边框并没有显示红色 原因是其右边的盒子压了它的边框
  • Flink CDC 详述实时数据湖

    在构建实时数仓的过程中 如何快速 正确的同步业务数据是最先面临的问题 本文主要讨论一下如何使用实时处理引擎Flink和数据湖Apache Iceberg两种技术 来解决业务数据实时入湖相关的问题 01 Flink CDC介绍 CDC全称是C
  • Mac 开发 Tang Nano FPGA 指南(使用终端和使用 VS Code 和插件,适用所有 Gowin FPGA)

    最近收到了一个 Tang nano 9K FPGA开发板 就想借此机会研究一下 官方文档里介绍如果想使用高云的 FPGA 就需要使用 GOWIN IDE 但是需要申请 license 提交一堆资料 我是别人送的就不太方便让别人弄 加上 ID
  • 一,凸包---3,极边

    极边就是组成凸包的边的集合 时间复杂度是o n3 比判断极点快 时间复杂度O n4 快 为什么呢 试想 不论极边也好 极点也好 判断的依据是三角形的方向 无论是海伦公式 还是向量叉乘 极边是需要三个点组成一个三角形 是一个三重循环 即可用t
  • 六.安装harbor

    1 下载 harbor offline installer v1 9 3 链接 https pan baidu com s 1dTCy2KPqRhYKxTyE7vlrPg 提取码 6666 需要安装docker compose 2 修改配置
  • Java基础之异常

    文章目录 前言 一 初识异常 二 异常的体系结构 三 异常的分类 四 异常的处理 1 throw 异常抛出 2 throws 异常声明 3 try catch 捕获处理 4 finally 5 try catch finally与retur
  • Hugo themes Doit 合并 tags , categories 为检索页

    Hugo themes Doit 合并 tags categories 为检索页 原文 总觉得 tags categories 等页面可以合并成为一页 这样检索起来更方便一些 成果 https www ftls xyz retrieval
  • 编译程序和解释程序有什么区别?

    1 编译程序和解释程序的区别 编译型是使用编译器编译后生成计算机硬件可直接执行的指令 解释型是在运行时才由解释器逐语句去执行 编译型代表 C C C Java 解释型代表 html javascript 区别有很多 说说常见的几个 编译型语
  • MATLAB bp神经网络预测代码

    清除变量 清楚变量 claer clc 导入数据 变量个数较少可以自己输入变量 变量数目较大时建议采用读取Excel并保存成 mat的方法来导入数据 读取 m数据 以data mat为例 load data mat load data1 m
  • React路由

    安装 npm i react router dom S 导入 import BrowserRouter as Router Route Link from react router dom HashRouter与BrowserRouter
  • iOS基础教程-SQLite数据库操作(二简单实例学生信息增删改查数据库操作)

    学生名单管理界面实现数据库的增删改操作 关于UI部分 我们使用storyboard简单完成 在上一篇文章中有详细的描述iOS基础教程 SQLite数据库操作 一 StoryBoard操作 SQLite操作前准备工作 本篇结束以后 就可以完成