SQLite3 是一个轻量级的开源关系数据库管理系统,它在许多应用程序中被广泛使用,尤其是在移动应用和嵌入式系统中。
- 自包含:SQLite 是一个自包含的数据库引擎,不依赖于外部服务器或其他依赖。所有的数据库管理功能都嵌入在一个库中,简化了部署和维护。
- 轻量级:SQLite 的库文件很小,通常不到 1 MB,适合资源受限的环境,如手机和嵌入式设备。
- 零配置:使用 SQLite 不需要复杂的安装和配置。数据库文件是一个普通的文件,应用程序可以直接读写它,无需专门的数据库服务器。
- 事务支持:SQLite 支持 ACID(原子性、一致性、隔离性、持久性)事务,确保数据的完整性和可靠性。
- SQL 支持:SQLite 支持标准的 SQL 查询语言,包括数据定义、数据操作和数据控制语言,但可能不支持某些高级功能或特性(如存储过程)。
- 跨平台:SQLite 支持多种操作系统,包括 Windows、macOS、Linux、Android 和 iOS。它的数据库文件格式在不同平台之间是兼容的。
- 嵌入式:SQLite 通常被嵌入到应用程序中,不需要额外的数据库服务器进程。它直接与应用程序的进程进行通信。
- 多线程支持:SQLite 可以在多线程环境中使用,但需要正确配置和使用相应的线程模式(单线程、多线程、序列化)。
- 文件格式:SQLite 数据库是一个文件,所有数据(表、索引、视图)都存储在一个单一的文件中,简化了备份和迁移。
- 无锁设计:SQLite 的锁机制设计是为了尽可能地减少锁冲突,支持高并发的读取操作。
这些特点使 SQLite 成为一个非常灵活且易于集成的数据库解决方案,特别适合小型到中型应用和不需要复杂数据库管理的场景。
1. 创建表
SQL 语句:
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER
);
Swift 示例:
创建一个 users 表,包含三列:id
(主键且自动递增)、name
(文本且不能为空)和 age
(整数)。
import SQLite3
var db: OpaquePointer?
// 打开数据库
func openDatabase() {
let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("example.db")
if sqlite3_open(fileURL.path, &db) != SQLITE_OK {
print("Error opening database")
} else {
print("Database opened successfully")
}
}
// 关闭数据库
func closeDatabase() {
if sqlite3_close(db) != SQLITE_OK {
print("Error closing database")
} else {
print("Database closed successfully")
}
}
func createTable() {
let createTableString = """
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER
);
"""
if sqlite3_exec(db, createTableString, nil, nil, nil) != SQLITE_OK {
print("Error creating table")
} else {
print("Table created successfully")
}
}
SQL 语句参数:
-
sqlite3_open
:打开数据库文件。如果数据库不存在,SQLite 会创建它。 -
sqlite3_close
:关闭数据库连接并释放资源。 -
CREATE TABLE users (...)
:定义表结构。users
是表名,id
,name
,age
是列名及其属性。
Swift 示例:
db
:SQLite 数据库的指针,指向打开的数据库。
createTableString
:包含 SQL 语句的字符串,用于创建表。
sqlite3_exec()
:执行 SQL 语句。参数包括数据库指针、SQL 语句、回调函数(这里为 nil)、错误信息(这里为 nil)和 nil(用于回调函数传递用户数据)
2. 创建表
SQL 语句:
INSERT INTO users (name, age) VALUES ('Alice', 30);
Swift 示例:
将用户数据插入到 users
表中。?
是占位符,用于防止 SQL 注入。
func insertUser(name: String, age: Int) {
let insertStatementString = "INSERT INTO users (name, age) VALUES (?, ?);"
var insertStatement: OpaquePointer?
if sqlite3_prepare_v2(db, insertStatementString, -1, &insertStatement, nil) == SQLITE_OK {
sqlite3_bind_text(insertStatement, 1, name, -1, nil)
sqlite3_bind_int(insertStatement, 2, Int32(age))
if sqlite3_step(insertStatement) == SQLITE_DONE {
print("Successfully inserted user.")
} else {
print("Failed to insert user.")
}
} else {
print("Failed to prepare insert statement.")
}
sqlite3_finalize(insertStatement)
}
SQL 语句参数:
-
INSERT INTO users (name, age) VALUES (?, ?);
:指定要插入的表、列名和对应的值。?
是占位符,用于安全地插入数据。
Swift 示例:
-
insertUser(name: String, age: Int)
:函数参数,用于指定要插入的用户数据。 -
insertStatementString
:SQL 插入语句的字符串。 -
insertStatement
:准备好的 SQL 语句的指针。 -
sqlite3_prepare_v2()
:准备 SQL 语句,参数包括数据库指针、SQL 语句、语句长度、准备好的语句指针、nil(用于错误信息)。 -
sqlite3_bind_text()
和sqlite3_bind_int()
:绑定参数值到 SQL 语句中的占位符。 -
sqlite3_step()
:执行 SQL 语句。 -
sqlite3_finalize()
:释放准备好的 SQL 语句资源。
3. 查询数据
SQL 语句:
SELECT * FROM users;
Swift 示例:
从 users 表中查询所有数据。sqlite3_step 用于遍历结果集
func queryUsers() {
let queryStatementString = "SELECT * FROM users;"
var queryStatement: OpaquePointer?
if sqlite3_prepare_v2(db, queryStatementString, -1, &queryStatement, nil) == SQLITE_OK {
while sqlite3_step(queryStatement) == SQLITE_ROW {
let id = sqlite3_column_int(queryStatement, 0)
let name = String(cString: sqlite3_column_text(queryStatement, 1))
let age = sqlite3_column_int(queryStatement, 2)
print("Query Result:")
print("Id: \(id), Name: \(name), Age: \(age)")
}
} else {
print("Failed to prepare query statement.")
}
sqlite3_finalize(queryStatement)
}
SQL 语句参数:
-
SELECT * FROM users;
:从表 users 中选择所有列和行。
Swift 示例:
-
queryUsers()
:函数用于查询并输出用户数据。 -
queryStatementString
:包含查询 SQL 语句的字符串。 -
queryStatement
:准备好的查询语句的指针。 -
sqlite3_prepare_v2()
:准备查询 SQL 语句。 -
sqlite3_step()
:执行查询,逐行读取数据。 -
sqlite3_column_int()
和sqlite3_column_text()
:从查询结果中提取列值。0、1、2 是列索引。
4. 更新数据
SQL 语句:
UPDATE users SET age = 31 WHERE name = 'Alice';
Swift 示例:
更新 users 表中符合条件的数据。参数绑定用于防止 SQL 注入。
func updateUser(name: String, newAge: Int) {
let updateStatementString = "UPDATE users SET age = ? WHERE name = ?;"
var updateStatement: OpaquePointer?
if sqlite3_prepare_v2(db, updateStatementString, -1, &updateStatement, nil) == SQLITE_OK {
sqlite3_bind_int(updateStatement, 1, Int32(newAge))
sqlite3_bind_text(updateStatement, 2, name, -1, nil)
if sqlite3_step(updateStatement) == SQLITE_DONE {
print("Successfully updated user.")
} else {
print("Failed to update user.")
}
} else {
print("Failed to prepare update statement.")
}
sqlite3_finalize(updateStatement)
}
SQL 语句参数:
-
UPDATE users SET age = ? WHERE name = ?;
:指定要更新的表、更新内容和条件。?
是占位符。
Swift 示例:
-
updateUser(name: String, newAge: Int)
:函数参数,指定要更新的用户和新年龄。 -
updateStatementString
:包含更新 SQL 语句的字符串。 -
updateStatement
:准备好的 SQL 语句的指针。 -
sqlite3_prepare_v2()
:准备 SQL 语句。 -
sqlite3_bind_int()
和sqlite3_bind_text()
:绑定更新值到占位符。 -
sqlite3_step()
:执行更新语句。 -
sqlite3_finalize()
:释放准备好的 SQL 语句资源。
5. 删除数据
SQL 语句:
DELETE FROM users WHERE name = 'Alice';
Swift 示例:
删除 users 表中符合条件的数据。参数绑定同样用于防止 SQL 注入。
func deleteUser(name: String) {
let deleteStatementString = "DELETE FROM users WHERE name = ?;"
var deleteStatement: OpaquePointer?
if sqlite3_prepare_v2(db, deleteStatementString, -1, &deleteStatement, nil) == SQLITE_OK {
sqlite3_bind_text(deleteStatement, 1, name, -1, nil)
if sqlite3_step(deleteStatement) == SQLITE_DONE {
print("Successfully deleted user.")
} else {
print("Failed to delete user.")
}
} else {
print("Failed to prepare delete statement.")
}
sqlite3_finalize(deleteStatement)
}
SQL 语句参数:
-
DELETE FROM users WHERE name = ?;
:指定要删除的表和条件。?
是占位符。
Swift 示例:
-
deleteUser(name: String)
:函数参数,指定要删除的用户。 -
deleteStatementString
:包含删除 SQL 语句的字符串。 -
deleteStatement
:准备好的删除语句的指针。 -
sqlite3_prepare_v2()
:准备 SQL 语句。 -
sqlite3_bind_text()
:绑定删除条件到占位符。 -
sqlite3_step()
:执行删除语句。 -
sqlite3_finalize()
:释放准备好的 SQL 语句资源。