好的 ✅
阿杰,以下是完整版本的 《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> 操作数据库高级开发、性能要求高
使用封装库(推荐)例如 FMDBGRDB.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, &amp;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, &amp;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, &amp;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, &amp;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, &amp;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, &amp;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 TRANSACTIONCOMMIT
创建索引提高查询速度:CREATE INDEX idx_name ON person(name);
使用预编译语句避免频繁编译 SQL
合理使用 VACUUM清理碎片,减少文件体积
避免过早加载分页查询 / 延迟加载数据

九、SQLite 与 Core Data 的关系

项目SQLiteCore Data
本质轻量数据库引擎对象管理框架(底层使用 SQLite)
操作方式SQL 查询语句面向对象操作(Entity / NSManagedObject)
性能快速较高抽象层,有一定性能损耗
使用场景简单结构 / 明确 SQL 逻辑复杂数据模型 / ORM 架构需求

🔟 推荐学习路线

入门阶段

  • 熟悉 SQL 基本语法
  • 能手动创建数据库、执行 CRUD 操作

进阶阶段

  • 封装数据库类 / 使用 FMDB
  • 了解事务与索引优化

高级阶段

  • 数据迁移(版本升级)
  • 混合使用 Core Data + SQLite
  • 分库 / 多线程访问安全处理

📘 附录:学习资源