SQLite关系型数据库的使用_MySQL
SQLite关系型数据库的使用
数据库(Database): 存放数据的仓库, 存放的是一张的表, 特别像Excel, Numbers, 都以表格的形式存放数据, 可以创建多张表。
常见的数据库: sqlite, MySQL, SQLServer, Oracle, Access。
使用数据库,主要是因为文件读写和归档读取数据需要一次把数据全部读出来, 占用内存开销大;其次是数据库数据效率高, 体现在增删改查。
数据库存储数据的步骤
1、新建一个数据库
2、新建一张表(table)
3、添加多个字段(column,列,属性)
4、添加多行记录(row,每行存放多个字段对应的值)
数据库的操作语句 (增删改查),即SQL(Structured Query Language)
SQL 语句不区分大小写, 字符串需要加""或''
常用语法:(主键: 是一条数据的唯一标示符, 一张表只能有一个主键, 主键不能够重复, 一般把主键名设为"id", 不需要赋值, 会自增;*代表所有的字段;where是条件)
1 表操作
(1)创建表: creat table 表名 (字段名字段数据类型 是否为主键, 字段名 字段数据类型, 字段名 字段数据类型...)
(2)修改表名:ALTER TABLE 旧表名 RENAME TO 新表名
(3)删除表:DROP TABLE 表名
(4)表添加一列:ALTER TABLE 表名 ADD COLUMN 列名数据类型 限定符
2 表数据操作
(1)查: select 字段名 (或者*) from 表名 where 字段名 = 值
(2)加: insert into 表名 (字段1, 字段2...) values (值1, 值2...)
(3)改: update 表名 set 字段 = 值 where 字段 = 值
(4)删: delete from 表名 where 字段 = 值
SQLite是一款轻型的嵌入式数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就足够了。它的处理速度比Mysql、PostgreSQL这两款著名的数据库都还快。
SQLite名词解释
2个重要结构体
1 sqlite3 *pdb(数据库句柄,跟文件句柄FILE类似)
2 sqlite3_stmt *stmt(这个相当于ODBC的Command对象,用于保存编译好的SQL语句)
5个主要函数
1 sqlite3_open()(打开数据库)
2 sqlite3_exec()(执行非查询的sql语句)
3 sqlite3_prepare()(准备sql语句,执行select语句或者要使用parameterbind时,用这个函数(封装了sqlite3_exec))
4 Sqlite3_step()(在调用sqlite3_prepare后,使用这个函数在记录集中移动)
5 Sqlite3_close()(关闭数据库文件)
SQLite 存储类
1 NULL(值是一个 NULL 值)
2 INTEGER(值是一个带符号的整数,根据值的大小存储在1、2、3、4、6 或 8 字节中)
3 REAL(值是一个浮点值,存储为 8 字节的 IEEE 浮点数字)
4 TEXT (值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储)
5 BLOB (值是一个 blob 数据,完全根据它的输入存储)
SQLite常用语句
1、打开数据库 sqlite3_open函数
2、预处理SQL语句sqlite3_prepare_v2函数
3、绑定参数sqlite3_bind_text函数
4、执行SQL语句sqlite3_step函数(状态:*SQLITE_BUSY-数据库被锁定、*SQLITE_DONE-成功执行过程、*SQLITE_ROW-返回一行结果、*SQLITE_ERROR-运行错误、*SQLITE_MISUSE-错误的使用了本函数)
5、提取字段数据sqlite3_column_text、sqlite3_column_blob、sqlite3_column_int等函数
6、释放statement对象资源 sqlite3_finalize函数
7、关闭数据库 sqlite3_close函数
SQLite的使用
1、在iOS中使用SQLite时,首先需要添加库文件libsqlite3.tbd
2、导入主头文件 #import
3、数据库操作(注:设置数据库名称及路径)
示例代码:
设置数据库路径
- (void)setSQLitePath
{
if (self.filePath == nil)
{
// document目录下
NSArray *documentArray =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
NSString *document = [documentArray objectAtIndex:0];
_filePath = [document stringByAppendingPathComponent:SQLiteFile];
}
NSLog(@"filePath %@", _filePath);
}
打开数据库,创建表
- (void)New
{
NSString *sql = @"CREATE TABLE IF NOT EXISTS STUDENT(NAME TEXTPRIMARY KEY, ADDRESS TEXT, PHONE TEXT)";
if (sql && 0 != sql.length)
{
[self setSQLitePath];
if ([[NSFileManager defaultManager] fileExistsAtPath:self.filePath])
{
// 打开数据库
sqlite3 *dataBase; // sqlite3
const char *fileName = [self.filePath UTF8String]; // [xxx UTF8String]是将NSString转换为C字符串,因为SQLite3是采用可移植的C(而不是 Objective-C)编写的,它不知道什么是NSString.
int openStatus = sqlite3_open(fileName, &dataBase);
if (openStatus != SQLITE_OK)
{
// 数据库打开失败,关闭数据库
sqlite3_close(dataBase);
NSAssert(0, @"打开数据库失败");
NSLog(@"打开数据库失败");
}
NSLog(@"打开数据库成功");
// 创建表
char *errorMsg;
const char *execSql = [sql UTF8String];
int execStatus = sqlite3_exec(dataBase,execSql, NULL, NULL, &errorMsg);
if (execStatus != SQLITE_OK)
{
// 创建表失败,关闭数据库
sqlite3_close(dataBase);
NSAssert1(0, @"创建表失败:%s",errorMsg);
}
NSLog(@"创建表成功");
}
}
}
插入数据
- (void)Insert
{
// ?号表示一个未定的值
NSString *sql = @"INSERT OR REPLACE INTO STUDENT (NAME, ADDRESS,PHONE) VALUES (?,?,?)";
if (sql && 0 != sql.length)
{
[self setSQLitePath];
if ([[NSFileManager defaultManager] fileExistsAtPath:self.filePath])
{
// 打开数据库
sqlite3 *dataBase; // sqlite3
const char *fileName = [self.filePath UTF8String];
int openStatus = sqlite3_open(fileName,&dataBase);
if (openStatus != SQLITE_OK)
{
// 数据库打开失败,关闭数据库
sqlite3_close(dataBase);
NSAssert(0, @"打开数据库失败");
NSLog(@"打开数据库失败");
}
NSLog(@"打开数据库成功");
const char *execSql = [sql UTF8String];
sqlite3_stmt *statment;
int execStatus = sqlite3_prepare_v2(dataBase, execSql, -1,&statment, nil); // 接口把一条SQL语句解析到statement结构里去. 使用该接口访问数据库是当前比较好的的一种方法
if (execStatus == SQLITE_OK)
{
NSLog(@"插入更新表成功");
// 绑定参数开始
// 这里的数字1,2,3代表上面的第几个问号,这里将三个值绑定到三个绑定变量
sqlite3_bind_text(statment, 1,[@"zhangshaoyu" UTF8String], -1, NULL);
sqlite3_bind_text(statment, 2,[@"meizhou" UTF8String], -1, NULL);
sqlite3_bind_text(statment, 3,[@"13800138000" UTF8String], -1, NULL);
// 执行SQL语句 执行插入
if (sqlite3_step(statment) !=SQLITE_DONE)
{
NSAssert(NO, @"插入更新表失败。");
}
else
{
NSLog(@"插入更新表成功");
}
}
else
{
NSLog(@"插入更新表失败");
}
// 释放sqlite3_stmt对象资源
sqlite3_finalize(statment);
// 关闭数据库
sqlite3_close(dataBase);
}
}
}
修改更新数据
- (void)Update
{
NSString *sql = @"UPDATE STUDENT SET ADDRESS = ? where NAME =?";
if (sql && 0 != sql.length)
{
[self setSQLitePath];
if ([[NSFileManager defaultManager]fileExistsAtPath:self.filePath])
{
// 打开数据库
sqlite3 *dataBase; // sqlite3
const char *fileName = [self.filePath UTF8String];
int openStatus = sqlite3_open(fileName, &dataBase);
if (openStatus != SQLITE_OK)
{
// 数据库打开失败,关闭数据库
sqlite3_close(dataBase);
NSAssert(0, @"打开数据库失败");
NSLog(@"打开数据库失败");
}
NSLog(@"打开数据库成功");
const char *execSql = [sql UTF8String];
sqlite3_stmt *statment;
int execStatus = sqlite3_prepare_v2(dataBase, execSql, -1,&statment, nil);
if (execStatus == SQLITE_OK)
{
NSLog(@"更新表成功");
// 绑定text类型的数据库数据
// 这里的数字1,2,3代表第几个问号。这里只有1个问号,这是一个相对比较简单的数据库操作,真正的项目中会远远比这个复杂
sqlite3_bind_text(statment, 1,[@"meizhouWUHUA" UTF8String], -1, NULL);
sqlite3_bind_text(statment, 2,[@"zhangshaoyu" UTF8String], -1, NULL);
// 执行插入
if (sqlite3_step(statment) !=SQLITE_DONE)
{
NSAssert(NO, @"更新表失败。");
}
else
{
NSLog(@"更新表成功");
}
}
else
{
NSLog(@"更新表失败");
}
// 释放sqlite3_stmt对象资源
sqlite3_finalize(statment);
// 关闭数据库
sqlite3_close(dataBase);
}
}
}
查找数据
- (void)Select
{
NSString *sql = @"SELECT * FROM STUDENT";
if (sql && 0 != sql.length)
{
[self setSQLitePath];
if ([[NSFileManager defaultManager] fileExistsAtPath:self.filePath])
{
// 打开数据库
sqlite3 *dataBase; // sqlite3
const char *fileName = [self.filePath UTF8String];
int openStatus = sqlite3_open(fileName, &dataBase);
if (openStatus != SQLITE_OK)
{
// 数据库打开失败,关闭数据库
sqlite3_close(dataBase);
NSAssert(0, @"打开数据库失败");
NSLog(@"打开数据库失败");
}
NSLog(@"打开数据库成功");
const char *execSql = [sql UTF8String];
sqlite3_stmt *statment;
int execStatus = sqlite3_prepare_v2(dataBase, execSql, -1,&statment, nil);
if (execStatus == SQLITE_OK)
{
NSLog(@"查询成功");
// 查询成功,执行遍历操作
// 查询结果集中一条一条的遍历所有的记录,这里的数字对应的是列值,注意这里的列值,跟上面sqlite3_bind_text绑定的列值不一样!一定要分开,不然会crash,只有这一处的列号不同,注意!
while(sqlite3_step(statment) ==SQLITE_ROW)
{
const char *NAME = (char*)sqlite3_column_text(statment, 0);
if (NAME != NULL)
{
NSString *name =[[NSString alloc] initWithUTF8String:NAME];
NSLog(@"NAME%@", name);
}
char *ADDRESS = (char*)sqlite3_column_text(statment, 1);
if (ADDRESS != NULL)
{
NSString *address =[[NSString alloc] initWithUTF8String:ADDRESS];
NSLog(@"ADDRESS%@", address);
}
char *PHONE = (char*)sqlite3_column_text(statment, 2);
if (PHONE != NULL)
{
NSString *phone =[[NSString alloc] initWithUTF8String:PHONE];
NSLog(@"PHONE%@", phone);
}
}
}
else
{
NSLog(@"查询失败");
}
// 释放sqlite3_stmt对象资源
sqlite3_finalize(statment);
// 关闭数据库
sqlite3_close(dataBase);
}
}
}
删除数据
- (void)Delete
{
//NSString *sql = @"DELETE FROM STUDENT"; // 方法1
NSString *sql = @"DELETE FROM STUDENT where NAME = ?"; // 方法2
if (sql && 0 != sql.length)
{
[self setSQLitePath];
if ([[NSFileManager defaultManager] fileExistsAtPath:self.filePath])
{
// 打开数据库
sqlite3 *dataBase; // sqlite3
const char *fileName = [self.filePath UTF8String];
int openStatus = sqlite3_open(fileName,&dataBase);
if (openStatus != SQLITE_OK)
{
// 数据库打开失败,关闭数据库
sqlite3_close(dataBase);
NSAssert(0, @"打开数据库失败");
NSLog(@"打开数据库失败");
}
NSLog(@"打开数据库成功");
const char *execSql = [sql UTF8String];
sqlite3_stmt *statment;
int execStatus = sqlite3_prepare_v2(dataBase, execSql, -1, &statment,nil);
if (execStatus == SQLITE_OK)
{
// 绑定text类型的数据库数据
// 这里的数字1,2,3代表第几个问号。这里只有1个问号,这是一个相对比较简单的数据库操作,真正的项目中会远远比这个复杂
sqlite3_bind_text(statment, 1,[@"zhangshaoyu" UTF8String], -1, NULL);
// 执行删除
if (sqlite3_step(statment) !=SQLITE_DONE)
{
NSAssert(NO, @"删除数据失败。");
NSLog(@"删除数据失败");
}
else
{
NSLog(@"删除数据成功");
}
}
else
{
NSLog(@"删除数据失败");
}
// 释放sqlite3_stmt对象资源
sqlite3_finalize(statment);
// 关闭数据库
sqlite3_close(dataBase);
}
}
}
删除表
- (void)DeleteTable
{
NSString *sql = @"DROP TABLE STUDENT";
if (sql && 0 != sql.length)
{
[self setSQLitePath];
if ([[NSFileManager defaultManager] fileExistsAtPath:self.filePath])
{
// 打开数据库
sqlite3 *dataBase; // sqlite3
const char *fileName = [self.filePath UTF8String];
int openStatus = sqlite3_open(fileName, &dataBase);
if (openStatus != SQLITE_OK)
{
// 数据库打开失败,关闭数据库
sqlite3_close(dataBase);
NSAssert(0, @"打开数据库失败");
NSLog(@"打开数据库失败");
}
NSLog(@"打开数据库成功");
const char *execSql = [sql UTF8String];
sqlite3_stmt *statment;
int execStatus = sqlite3_prepare_v2(dataBase, execSql, -1,&statment, nil);
if (execStatus == SQLITE_OK)
{
// 执行删除
if (sqlite3_step(statment) !=SQLITE_DONE)
{
NSAssert(NO, @"删除表失败。");
NSLog(@"删除表失败");
}
else
{
NSLog(@"删除表成功");
}
}
else
{
NSLog(@"删除表失败");
}
// 释放sqlite3_stmt对象资源
sqlite3_finalize(statment);
// 关闭数据库
sqlite3_close(dataBase);
}
}
}
数据查看
注意事项:
1、由于sqlite3是基于C语言编写的,而不是纯粹的object-c,所以有关字符串,我们不能使用NSString,因为它不识别,所以只能用c语言的字符串,char*,好在Nsstring提供了转换的方法,那就是 UTF8String。如:
NSString*sql = @"DELETE FROM STUDENT where NAME = ?";
constchar *execSql = [sql UTF8String];
2、sql语句中,不确定值使用?符号。如:
NSString*sql = @"DELETE FROM STUDENT where NAME = ?";
3、提取查询数据函数中的数字表示sql语句中的第几列(0~N)。如:
表示第1列:constchar *NAME = (char *)sqlite3_column_text(statment, 0);
4、绑定数据时函数中的数字表示sql语句中的第几个值。如:
NSString*sql = @"INSERT OR REPLACE INTO STUDENT (NAME, ADDRESS, PHONE) VALUES(?,?,?)";
表示第1个值:sqlite3_bind_text(statment,1, [@"zhangshaoyu" UTF8String], -1, NULL);
表示第2个值:sqlite3_bind_text(statment,2, [@"meizhou" UTF8String], -1, NULL);
表示第3个值:sqlite3_bind_text(statment,3, [@"13510213244" UTF8String], -1, NULL);
5、创建表时,必须设置一个主键PRIMARY KEY。如:
NSString*sql = @"CREATE TABLE IF NOT EXISTS STUDENT(NAME TEXT PRIMARY KEY, ADDRESSTEXT, PHONE TEXT)";

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Go 언어는 효율적이고 간결하며 배우기 쉬운 프로그래밍 언어입니다. 동시 프로그래밍과 네트워크 프로그래밍의 장점 때문에 개발자들이 선호합니다. 실제 개발에서 데이터베이스 작업은 필수적인 부분입니다. 이 기사에서는 Go 언어를 사용하여 데이터베이스 추가, 삭제, 수정 및 쿼리 작업을 구현하는 방법을 소개합니다. Go 언어에서는 일반적으로 사용되는 SQL 패키지, Gorm 등과 같은 타사 라이브러리를 사용하여 데이터베이스를 운영합니다. 여기서는 sql 패키지를 예로 들어 데이터베이스의 추가, 삭제, 수정 및 쿼리 작업을 구현하는 방법을 소개합니다. MySQL 데이터베이스를 사용하고 있다고 가정합니다.

Apple의 최신 iOS18, iPadOS18 및 macOS Sequoia 시스템 릴리스에는 사진 애플리케이션에 중요한 기능이 추가되었습니다. 이 기능은 사용자가 다양한 이유로 손실되거나 손상된 사진과 비디오를 쉽게 복구할 수 있도록 설계되었습니다. 새로운 기능에는 사진 앱의 도구 섹션에 '복구됨'이라는 앨범이 도입되었습니다. 이 앨범은 사용자가 기기에 사진 라이브러리에 포함되지 않은 사진이나 비디오를 가지고 있을 때 자동으로 나타납니다. "복구된" 앨범의 출현은 데이터베이스 손상으로 인해 손실된 사진과 비디오, 사진 라이브러리에 올바르게 저장되지 않은 카메라 응용 프로그램 또는 사진 라이브러리를 관리하는 타사 응용 프로그램에 대한 솔루션을 제공합니다. 사용자는 몇 가지 간단한 단계만 거치면 됩니다.

Hibernate 다형성 매핑은 상속된 클래스를 데이터베이스에 매핑할 수 있으며 다음 매핑 유형을 제공합니다. Join-subclass: 상위 클래스의 모든 열을 포함하여 하위 클래스에 대한 별도의 테이블을 생성합니다. 클래스별 테이블: 하위 클래스별 열만 포함하는 하위 클래스에 대한 별도의 테이블을 만듭니다. Union-subclass: Joined-subclass와 유사하지만 상위 클래스 테이블이 모든 하위 클래스 열을 통합합니다.

HTML은 데이터베이스를 직접 읽을 수 없지만 JavaScript 및 AJAX를 통해 읽을 수 있습니다. 단계에는 데이터베이스 연결 설정, 쿼리 보내기, 응답 처리 및 페이지 업데이트가 포함됩니다. 이 기사에서는 JavaScript, AJAX 및 PHP를 사용하여 MySQL 데이터베이스에서 데이터를 읽는 실제 예제를 제공하고 쿼리 결과를 HTML 페이지에 동적으로 표시하는 방법을 보여줍니다. 이 예제에서는 XMLHttpRequest를 사용하여 데이터베이스 연결을 설정하고 쿼리를 보내고 응답을 처리함으로써 페이지 요소에 데이터를 채우고 데이터베이스를 읽는 HTML 기능을 실현합니다.

MySQLi를 사용하여 PHP에서 데이터베이스 연결을 설정하는 방법: MySQLi 확장 포함(require_once) 연결 함수 생성(functionconnect_to_db) 연결 함수 호출($conn=connect_to_db()) 쿼리 실행($result=$conn->query()) 닫기 연결( $conn->close())

PHP에서 데이터베이스 연결 오류를 처리하려면 다음 단계를 사용할 수 있습니다. mysqli_connect_errno()를 사용하여 오류 코드를 얻습니다. 오류 메시지를 얻으려면 mysqli_connect_error()를 사용하십시오. 이러한 오류 메시지를 캡처하고 기록하면 데이터베이스 연결 문제를 쉽게 식별하고 해결할 수 있어 애플리케이션이 원활하게 실행될 수 있습니다.

PHP는 웹사이트 개발에 널리 사용되는 백엔드 프로그래밍 언어로, 강력한 데이터베이스 운영 기능을 갖추고 있으며 MySQL과 같은 데이터베이스와 상호 작용하는 데 자주 사용됩니다. 그러나 한자 인코딩의 복잡성으로 인해 데이터베이스에서 잘못된 한자를 처리할 때 문제가 자주 발생합니다. 이 기사에서는 잘못된 문자의 일반적인 원인, 솔루션 및 특정 코드 예제를 포함하여 데이터베이스에서 중국어 잘못된 문자를 처리하기 위한 PHP의 기술과 사례를 소개합니다. 문자가 왜곡되는 일반적인 이유는 잘못된 데이터베이스 문자 집합 설정 때문입니다. 데이터베이스를 생성할 때 utf8 또는 u와 같은 올바른 문자 집합을 선택해야 합니다.

Go 표준 라이브러리 데이터베이스/sql 패키지를 통해 MySQL, PostgreSQL 또는 SQLite와 같은 원격 데이터베이스에 연결할 수 있습니다. 데이터베이스 연결 정보가 포함된 연결 문자열을 생성합니다. sql.Open() 함수를 사용하여 데이터베이스 연결을 엽니다. SQL 쿼리 및 삽입 작업과 같은 데이터베이스 작업을 수행합니다. 리소스를 해제하기 위해 defer를 사용하여 데이터베이스 연결을 닫습니다.
