本文介绍: 本文介绍SQLite使用 数据库(Database)是根据数据结构组织存储管理数据仓库数据库大致分为两种:关系数据库(主流)、对象数据库SQLite本文总结了在iOS开发中用OC语言如何使用SQLite数据库介绍了SQLite相关函数,以及SQLite基本语句iOS中原生的SQLite API在进行数存储时候需要使用C语言中的函数操作比较麻烦,于是就出现了一系列将SQLite封装的库:CoreData(Apple官方)、FMDB(第三方),后

数据库简介

本文介绍SQLite的使用,首先简单了解一下什么数据库


什么SQLite

SQLite一款轻型嵌入式数据库(用C语言写的开源库),实现一个包含SQL关系数据库引擎,可存储操作大量数据,作为关系数据库我们可以一个数据库中建立多张相关联的表来解决大量数据重复问题,而且SQLite库也针对移动设备上的使用进行了优化

SQLite接口使用C语言写的,而且 Objective-C是C的超集,所以可以直接工程中使用SQLite

SQLite占用资源非常的低,在嵌入式设备中,可能需要几百K的内存就够了,而且处理速度比Mysql、PostgreSQL这两款著名的数据库都还快

在Xcode引入SQLite API

  1. 项目配置界面选择Build Phrases
    在这里插入图片描述
  2. 点开Link Binary With Libraries后,点击+号,子弹窗输入sqlite
    请添加图片描述
  3. 添加任意一个,两个都是一样的
    请添加图片描述
  4. 需要使用SQLite的地方导入sqlite即可
#import <sqlite3.h&gt;

@interface ViewController () {
    sqlite3* _sqlite;
}
@end

SQL语句的种类

数据定义语句(DDL:Data Definition Language)

数据操作语句(DML:Data Manipulation Language)

  • 对表(TABLE)中的数据进行操作
  • 包括INSERTDELETEUPDATESELECT等操作

数据查询语句(DQL:Data Query Language)

数据控制语句(DCL:Data Control Language)

存储字段类型

存储 描述
NULL 空值
INTEGER 符号整型
REAL 浮点值
TEXT 文本字符串,使用数据库编码(UTF-8、UTF-16BE或UTF-16LE)存储
BLOB 二进制数据(比如文件模型),完全根据它的输入存储

实际上SQLite字段是无类型的,就算声明为INTEGER类型,仍能存储字符串文本主键除外),建表声明任何类型或不声明类型可以比如CREATE TABLE TB_One(name, age)

为了保持良好的编程规范,方便程序员之间交流编写建表语句的时候最好加上每个字段的具体类型,也是约定俗成的规则

SQLite的使用

创建数据库

实际上是打开指定数据库,有数据库文件就去打开它,没有自动创建数据库

1. 获取数据文件路径

    //SQLite文件名
    static NSString* const dataBaseName = @"MyFirstDB.sqlite";
    
    //将数据库存沙盒中的Documents路径
    //获取Documents路径
    NSString* sandBoxPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
    
    //拼接得到数据库文件地址
    NSString* filePath = [sandBoxPath stringByAppendingPathComponent: dataBaseName];

SQLite文件名自己随便起,后缀最好.db.sqilte用来表示这是一个数据库

2. 打开指定数据库

NSInteger status = sqlite3_open(filePath.UTF8String, &amp;_sqlite);
if (status == SQLITE_OK) {
    NSLog(@"打开数据库成功");
} else {
    NSLog(@"打开数据库失败");
}

枚举SQLITE_OK 代表成功的状态

在这里插入图片描述
查看沙盒内的数据库文件

请添加图片描述

创建表和删表

我们第一次打开数据库后,数据库里面什么没有我们需要创建一张数据库表存放数据

1. 创建基本格式

示例CREATE TABLE t_Student(ID INTEGER, NAME TEXT NOT NULL, AGE INTEGER NOT NULL, SCORE REAL);NAME和AGE后面的NOT NULL约束表示表中创建记录这个字段不能为NULL,常见约束还有DEFAULTUNIQUEPRIMARY KEY约束,更多SQLite约束总结详见这篇文章SQLite约束总结

NSInteger state = sqlite3_open(filePath.UTF8String, &amp;_sqlite);
    if (state == SQLITE_OK) {
        NSLog(@"打开数据库成功");
        
        //创建表SQL语句
        NSString* SQLString = @"CREATE TABLE IF NOT EXISTS t_Student(ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT NOT NULL, AGE INTEGER NOT NULL, SCORE REAL)";
        
        //保存错误信息
        char* errorMsg = NULL;
        NSInteger result = sqlite3_exec(_sqlite, SQLString.UTF8String, NULL, NULL, &amp;errorMsg);
        if (result == SQLITE_OK) {
            NSLog(@"创表成功");
        } else {
            NSLog(@"创表失败 -> errorMessage: %s", errorMsg);
        }
        
    } else {
        NSLog(@"打开数据库失败");
    }
//直接用C语言风格字符串也可
const char* SQLString = "CREATE TABLE IF NOT EXISTS t_Student(ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT NOT NULL, AGE INTEGER NOT NULL, SCORE REAL)";
        
char* errorMsg = NULL;
sqlite3_exec(_sqlite, SQLString, NULL, NULL, &amp;errorMsg);
if (!errorMsg) {
    NSLog(@"创表成功");
} else {
    NSLog(@"创表失败 -> errorMessage: %s 当前文件路径:%s 当前行数:%d", errorMsg, __FILE__, __LINE__);
}

__FILE____LINE__标准C语言中的预定义宏,前者用以指示本行语句所在源文件文件,后者用以指示本行语句所在源文件中的位置信息

执行后,创建表成功,打开数据库文件查看
先在终端输入sqlite3 数据库文件路径,输入.tables查看哪些数据库表.quit退出数据库文件在这里插入图片描述可以看到不仅有里面创建的t_Student表Table,还有我之后创建的t_Fellow


电脑一般不会预装相关查看sqlite数据库的软件这里通过Mac终端查看Sqlite,参考Mac通过终端使用Sqlite3数据库


既然已经成功创建了表,现将SQL语句中的IF NOT EXISTS删去,执行创表失败相关语句:在这里插入图片描述错误信息也会提示该表已经创建!

2. 有关主键

良好的数据库编程规范应该要保证每条记录唯一性,为此增加了主键约束,每张表必须有一个主键,用来表示记录唯一性,创表时用PRIMARY KEY声明一个主键

示例CREATE TABLE t_Student(ID INTEGER PRIMARY KEY, NAME TEXT NOT NULL, AGE INTEGER NOT NULL, SCORE REAL);
只要声明为PRIMARY KEY,就说明是一个主键字段,主键字段默认包含NOT NULLUNIQUE两个约束

主键的设计原则

如果想要让主键自动增长(必须是INTEGER类型),应该增加AUTOINCREMENT示例CREATE TABLE t_Student (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT NOT NULL, AGE INTEGER NOT NULL, SCORE REAL);

3. 删除基本格式

仍使用sqlite3_exec执行:

const char* SQLString = "DROP TABLE t_Fellow";
        
char* errorMsg = NULL;
sqlite3_exec(_sqlite, SQLString, NULL, NULL, &amp;errorMsg);
if (!errorMsg) {
    NSLog(@"删表成功");
} else {
    NSLog(@"删表失败 -> errorMessage: %s 当前文件路径:%s 当前行数:%d", errorMsg, __FILE__, __LINE__);
}

t_Fellow表已删:
请添加图片描述

如果删除不存在的表,错误信息为:
请添加图片描述

数据表操作

增(插入数据INSERT)
  • INSERT INTO 表名 (字段1, 字段2, …) values (字段1的值, 字段2的值, …);

示例:INSERT INTO t_Student (NAME, AGE) VALUES ('Jacky', 20);数据库中字符串内容应该用单引号``括起来

for (int i = 0; i < 7; ++i) {
    NSString* name = [NSString stringWithFormat: @"Jacky-%d号", i + 1];
    NSString* SQLString = [NSString stringWithFormat: @"INSERT INTO t_Student (NAME, AGE) VALUES ('%@', %d)", name, i + 19];

    char* errorMsg = NULL;
    sqlite3_exec(_sqlite, SQLString.UTF8String, NULL, NULL, &errorMsg);
    if (!errorMsg) {
        NSLog(@"插入数据成功");
    } else {
        NSLog(@"插入数据失败 -> errorMessage: %s", errorMsg);
    }
}

查看打印日志

请添加图片描述

终端查看数据库表内容

请添加图片描述

删(删除数据DELETE)
const char* SQLString = "DELETE FROM t_Student WHERE NAME = 'Jacky-4号'";
        
char* errorMsg = NULL;
sqlite3_exec(_sqlite, SQLString, NULL, NULL, &errorMsg);
if (!errorMsg) {
    NSLog(@"删除数据成功");
} else {
    NSLog(@"删表数据失败 -> errorMessage: %s", errorMsg);
}

请添加图片描述

改(更新数据UPDATE)
  • UPDATE 表名 SET 字段1 = 更新值, 字段2 = 更新值, … ; 改变所有字段为字段1字段2的值
  • UPDATE 表名 SET 字段1 = 更新值, 字段2 = 更新值, … WHERE 查询条件; 改变指定字段数据
const char* SQLString = "UPDATE t_Student SET NAME = 'Jackson-2号' WHERE AGE = 20";

char* errorMsg = NULL;
sqlite3_exec(_sqlite, SQLString, NULL, NULL, &errorMsg);
if (!errorMsg) {
    NSLog(@"更新数据成功");
} else {
    NSLog(@"更新数据失败 -> errorMessage: %s", errorMsg);
}

请添加图片描述

查(查询数据SELECT)
  • SELECT * FROM 表名; 获取所有可用字段
  • SELECT 字段1, 字段2, … FROM 表名; 查询指定字段数据

SELECT查询操作也可以使用sqlite3_exec执行,但通常使用sqlite3_prepare_v2(sqlite3 *db, const char *zSql, int nByte, sqlite3_stmt **ppStmt, const char **pzTail);函数,该函数将SQL语句编译成SQLite虚拟机指令,并将编译后的SQLite3语句对象存储在ppStmt指向指针中,以备执行。如果pzTail不是NULL,则该指针指向SQL语句中未编译部分起始位置

//查询age不等于19的数据
const char* SQLString = "SELECT ID, NAME, AGE FROM t_Student WHERE AGE != 19";
        
//用stmt取出查询结果
sqlite3_stmt* stmt = NULL;
        
NSInteger state = sqlite3_prepare_v2(_sqlite, SQLString, -1, &stmt, NULL);
if (state == SQLITE_OK) {
    NSLog(@"查询语句没有问题 读取数据成功");
            
    //每调用一次sqlite3_step函数stmt就会指向一条数据
while (sqlite3_step(stmt) == SQLITE_ROW) {  //找到一条记录
        //读取数据
                
        //取出第0列字段的值(int类型)
        int ID = sqlite3_column_int(stmt, 0);
        //取出第1列字段的值(text类型)
        const unsigned char* name = sqlite3_column_text(stmt, 1);
        //取出第2列字段的值(int类型)
        int age = sqlite3_column_int(stmt, 2);
                
        printf("%d %s %dn", ID, name, age);
    }
} else {
    NSLog(@"查询语句有问题 读取数据失败");
}

执行情况:

请添加图片描述

补充

条件语句

如果只想给内容更新或者删除某些指定的数据,就需在DML语句上加上条件语句

以下为条件语句常见格式:

  • WHERE 字段 = 某个值; 注意只有一个=
  • WHERE 字段 is 某个值; is相当于=
  • WHERE 字段 != 某个值;
  • *WHERE 字段 is not 某个值; *is not相当于!=
  • WHERE 字段 > 某个值;
  • WHERE 字段1 = 某个值 and 字段2 > 某个值; and相当于C语言中的&&
  • WHERE 字段1 = 某个值 or 字段2 = 某个值; or相当于C语言中的||

示例:将t_Student表中年龄小于等于25或者年龄大于21的数据,NAME都改为JackyUPDATE t_Student SET NAME = 'Jackson' WHERE AGE > 21 and AGE <= 25;

请添加图片描述
为方便演示我们再改回去

别名

字段名、表名别名基本格式如下

  • SELECT 字段1 别名, 字段2 别名, … FROM 表名 别名;
  • SELECT 字段1 别名, 字段2 as 别名, … FROM 表名 as 别名;
  • SELECT 别名.字段1, 别名.字段2, … FROM 表名;

示例:
给字段起别名SELECT NAME USER, AGE AS OLD, SCORE POINT FROM t_Student;
请添加图片描述

给表t_Student起个别名s, 利用s来引用表中的字段SELECT s.NAME, s.AGE FROM t_Student s;
请添加图片描述

算数据的数量

基本格式:

  • SELECT COUNT (字段) FROM 表名;
  • SELECT COUNT ( * ) FROM 表名;

示例:SELECT COUNT (*) FROM t_Student WHERE AGE > 21;

请添加图片描述

排序

根据某个字段的值进行排序搜索基本格式如下:

  • SELECT * FROM 表名 ORDER BY 字段; 示例:SELECT * FROM t_Student ORDER BY AGE
  • 默认是按照升序排序从小到大),也可以写为SELECT * FROM t_Student ORDER BY AGE ASC;也可以变为降序(从大到小)SELECT * FROM t_Student ORDER BY AGE DESC
    在这里插入图片描述
  • 多个字段进行排序,先根据年龄排序升序),年龄相等就根据ID排序降序SELECT * FROM t_Student ORDER BY AGE ASC, ID DESC;
    请添加图片描述
LIMIT

使用LIMIT可以精确地控制查询结果的数量,基本格式如下:

示例:比如现在有6条数据,SELECT * FROM t_Student LIMIT 2, 4;表示跳过最前面2条数据,然后取4条数

请添加图片描述

LIMIT经常用来做分页查询,比如每页固定显示7条数据,那么应该这样取数据:

第1页:LIMIT 0, 7 第2页:LIMIT 7, 7 第3页:LIMIT 14, 7 … 第n页:LIMIT (n – 1)*7, 7


结束

本文总结了在iOS开发中用OC语言如何去使用SQLite数据库,介绍了SQLite相关函数,以及SQLite的基本语句

iOS中原生的SQLite API在进行数据存储的时候,需要使用C语言中的函数,操作比较麻烦,于是就出现了一系列将SQLite封装的库:CoreData(Apple官方)、FMDB(第三方),后续将会对这两个基于SQLite编写的库进行学习!🫡

原文地址:https://blog.csdn.net/XY_Mckevince/article/details/134494928

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_49726.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注