好的 ✅
阿杰,以下是完整版本的 《iOS SQLite 学习指南(全)》,
涵盖从原理、环境、API 到 Swift / Objective-C 实战与优化策略。
非常适合系统学习或制作教程笔记 / PDF 手册使用。
🍎 iOS SQLite 学习指南(全)
一、SQLite 概述
🔹 什么是 SQLite?
SQLite 是一种轻量级嵌入式关系型数据库引擎,
它以单个 .sqlite
文件形式存储数据,无需服务器。
📌 iOS 系统内置 SQLite3(无需安装)。
优点:
- 内嵌于系统中(无需额外依赖)
- 小巧、快速、稳定
- 支持标准 SQL 语法
- 事务安全(ACID)
适用场景:
- 小中型应用数据存储
- 本地缓存、用户配置、收藏、离线数据
- 离线消息或笔记类 App
二、SQLite 在 iOS 中的使用方式
方式 | 说明 | 适用场景 |
---|---|---|
直接使用 SQLite C API | 使用 <sqlite3.h> 操作数据库 | 高级开发、性能要求高 |
使用封装库(推荐) | 例如 FMDB 、GRDB.swift | 快速开发、代码简洁 |
使用 Core Data | 苹果官方 ORM 框架(底层仍用 SQLite) | 数据模型复杂的 App |
三、SQLite 数据库结构
SQLite 支持标准的关系型结构:
- 数据库(Database)
- 表(Table)
- 字段(Column)
- 行(Row)
- 主键 / 外键
- 索引(Index)
四、SQLite 基本 SQL 操作
类型 | 语句示例 | 说明 |
---|---|---|
创建表 | CREATE TABLE user(id INTEGER PRIMARY KEY, name TEXT, age INTEGER); | 建表 |
插入数据 | INSERT INTO user(name, age) VALUES('Tom', 25); | 新增 |
查询数据 | SELECT * FROM user; | 查询 |
更新数据 | UPDATE user SET age=26 WHERE name='Tom'; | 修改 |
删除数据 | DELETE FROM user WHERE id=1; | 删除 |
五、iOS 中使用 SQLite(C API)
1️⃣ 导入库
import SQLite3
2️⃣ 打开数据库
var db: OpaquePointer?
if sqlite3_open(filePath, &db) == SQLITE_OK {
print("数据库打开成功")
} else {
print("打开失败")
}
📁 一般存储路径:
let fileURL = try! FileManager.default .url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) .appendingPathComponent("mydb.sqlite")
3️⃣ 创建表
let createTable = "CREATE TABLE IF NOT EXISTS person (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)"
if sqlite3_exec(db, createTable, nil, nil, nil) == SQLITE_OK {
print("表创建成功")
}
4️⃣ 插入数据
var stmt: OpaquePointer?
let insertSQL = "INSERT INTO person (name, age) VALUES (?, ?)"
if sqlite3_prepare_v2(db, insertSQL, -1, &stmt, nil) == SQLITE_OK {
sqlite3_bind_text(stmt, 1, "Alice", -1, nil)
sqlite3_bind_int(stmt, 2, 30)
if sqlite3_step(stmt) == SQLITE_DONE {
print("插入成功")
}
}
sqlite3_finalize(stmt)
5️⃣ 查询数据
let query = "SELECT * FROM person"
if sqlite3_prepare_v2(db, query, -1, &stmt, nil) == SQLITE_OK {
while sqlite3_step(stmt) == SQLITE_ROW {
let id = sqlite3_column_int(stmt, 0)
let name = String(cString: sqlite3_column_text(stmt, 1))
let age = sqlite3_column_int(stmt, 2)
print("ID:\(id) 姓名:\(name) 年龄:\(age)")
}
}
sqlite3_finalize(stmt)
6️⃣ 更新数据
let update = "UPDATE person SET age = ? WHERE name = ?"
if sqlite3_prepare_v2(db, update, -1, &stmt, nil) == SQLITE_OK {
sqlite3_bind_int(stmt, 1, 35)
sqlite3_bind_text(stmt, 2, "Alice", -1, nil)
if sqlite3_step(stmt) == SQLITE_DONE {
print("更新成功")
}
}
sqlite3_finalize(stmt)
7️⃣ 删除数据
let delete = "DELETE FROM person WHERE id = ?"
if sqlite3_prepare_v2(db, delete, -1, &stmt, nil) == SQLITE_OK {
sqlite3_bind_int(stmt, 1, 1)
if sqlite3_step(stmt) == SQLITE_DONE {
print("删除成功")
}
}
sqlite3_finalize(stmt)
六、在 Swift 中封装数据库操作(推荐)
创建一个通用的 SQLite 管理类:
class SQLiteManager {
static let shared = SQLiteManager()
var db: OpaquePointer?
private init() {
openDB()
}
func openDB() {
let fileURL = try! FileManager.default
.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
.appendingPathComponent("app.sqlite")
sqlite3_open(fileURL.path, &db)
}
func execSQL(_ sql: String) -> Bool {
return sqlite3_exec(db, sql, nil, nil, nil) == SQLITE_OK
}
}
七、FMDB:更优雅的 SQLite 封装库(推荐)
📦 FMDB 是对 SQLite 的 Objective-C 封装,Swift 同样适用。
✅ 安装
在 Podfile
中加入:
pod 'FMDB'
✅ 使用示例
import FMDB
let dbPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let db = FMDatabase(path: dbPath + "/test.sqlite")
if db.open() {
db.executeUpdate("CREATE TABLE IF NOT EXISTS person (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)", withArgumentsIn: [])
db.executeUpdate("INSERT INTO person (name, age) VALUES (?, ?)", withArgumentsIn: ["Tom", 20])
let rs = try! db.executeQuery("SELECT * FROM person", values: nil)
while rs.next() {
print("姓名:\(rs.string(forColumn: "name")!), 年龄:\(rs.int(forColumn: "age"))")
}
db.close()
}
八、SQLite 常见优化技巧
优化点 | 说明 |
---|---|
使用事务 | 批量插入前 BEGIN TRANSACTION → COMMIT |
创建索引 | 提高查询速度:CREATE INDEX idx_name ON person(name); |
使用预编译语句 | 避免频繁编译 SQL |
合理使用 VACUUM | 清理碎片,减少文件体积 |
避免过早加载 | 分页查询 / 延迟加载数据 |
九、SQLite 与 Core Data 的关系
项目 | SQLite | Core Data |
---|---|---|
本质 | 轻量数据库引擎 | 对象管理框架(底层使用 SQLite) |
操作方式 | SQL 查询语句 | 面向对象操作(Entity / NSManagedObject) |
性能 | 快速 | 较高抽象层,有一定性能损耗 |
使用场景 | 简单结构 / 明确 SQL 逻辑 | 复杂数据模型 / ORM 架构需求 |
🔟 推荐学习路线
✅ 入门阶段
- 熟悉 SQL 基本语法
- 能手动创建数据库、执行 CRUD 操作
✅ 进阶阶段
- 封装数据库类 / 使用 FMDB
- 了解事务与索引优化
✅ 高级阶段
- 数据迁移(版本升级)
- 混合使用 Core Data + SQLite
- 分库 / 多线程访问安全处理
📘 附录:学习资源
- SQLite 官方文档
- FMDB GitHub
- Apple 官方文档:Using SQLite on iOS
发表回复