iOS第三十九篇:Realm数据库使用指南

# iOS Realm数据库使用指南

## 目录
1. [Realm核心优势](#realm核心优势)
2. [环境配置](#环境配置)
3. [数据模型定义](#数据模型定义)
4. [CRUD操作](#crud操作)
5. [查询与排序](#查询与排序)
6. [数据迁移](#数据迁移)
7. [多线程处理](#多线程处理)
8. [性能优化](#性能优化)
9. [实战案例](#实战案例)

---

## Realm核心优势

### 与传统数据库对比
| 特性 | Realm | Core Data | SQLite |
|------|-------|-----------|--------|
| 响应速度 | ⭐️⭐️⭐️⭐️⭐️ | ⭐️⭐️⭐️ | ⭐️⭐️⭐️⭐️ |
| 内存占用 | ⭐️⭐️⭐️⭐️ | ⭐️⭐️ | ⭐️⭐️⭐️⭐️ |
| 跨平台支持 | ✅ | ❌ | ✅ |
| 零拷贝设计 | ✅ | ❌ | ❌ |

### 适用场景
- 需要高性能读写的应用(如即时通讯)
- 复杂对象关系的场景
- 跨平台数据同步需求

---

## 环境配置

### CocoaPods集成
```ruby
# Podfile
pod 'RealmSwift', '~> 10.42.0'

Swift Package Manager

// Package.swift
dependencies: [
    .package(url: "https://github.com/realm/realm-swift.git", from: "10.42.0")
]

初始化配置

import RealmSwift

let config = Realm.Configuration(
    schemaVersion: 1,
    migrationBlock: { migration, oldSchemaVersion in
        // 迁移逻辑
    }
)
Realm.Configuration.defaultConfiguration = config

数据模型定义

基本模型

class User: Object {
    @Persisted(primaryKey: true) var id: Int
    @Persisted var name: String
    @Persisted var age: Int?
    @Persisted var emails: List<String> // 集合类型
}

关系模型

class Post: Object {
    @Persisted var title: String
    @Persisted var content: String
    @Persisted var author: User? // 对一关系
    @Persisted var comments: List<Comment> // 对多关系
}

属性特性

修饰符说明
@Persisted可持久化属性
primaryKey主键标记
indexed创建索引
ignored忽略持久化

CRUD操作

写入操作

let realm = try! Realm()

// 增
try! realm.write {
    let user = User()
    user.id = 1
    user.name = "Alice"
    realm.add(user)
}

// 改
try! realm.write {
    user.name = "Bob"
}

// 删
try! realm.write {
    realm.delete(user)
}

批量操作

try! realm.write {
    realm.add(users, update: .modified) // 批量更新
    realm.deleteAll() // 清空数据库
}

查询与排序

基础查询

let users = realm.objects(User.self)
let adults = users.filter("age >= 18") // 条件查询
let firstUser = users.first // 首条记录

高级查询

// 链式查询
let results = users
    .filter("age BETWEEN {18, 60}")
    .sorted(byKeyPath: "name", ascending: true)
    .prefix(10)

// 聚合操作
let maxAge = users.max(ofProperty: "age")
let avgAge = users.average(ofProperty: "age")

排序方式

方法说明
sorted(byKeyPath:)单字段排序
sorted(by:)多字段排序
reversed()反向排序

数据迁移

简单迁移

// 版本升级时添加字段
let config = Realm.Configuration(
    schemaVersion: 2,
    migrationBlock: { migration, oldSchemaVersion in
        if oldSchemaVersion < 2 {
            migration.enumerateObjects(ofType: User.className()) { old, new in
                new?["address"] = "" // 新增字段
            }
        }
    }
)

复杂迁移

migration.enumerateObjects(ofType: User.className()) { old, new in
    // 字段重命名
    migration.renameProperty(onType: User.className(), 
                           from: "oldName", 
                           to: "newName")
    
    // 类型转换
    new?["age"] = Int(old?["ageString"] as? String ?? "0")
}

多线程处理

线程安全规则

  • 禁止跨线程共享实例
  • 通过ThreadSafeReference传递对象

跨线程访问

let userRef = ThreadSafeReference(to: user)
DispatchQueue.global().async {
    let realm = try! Realm()
    guard let user = realm.resolve(userRef) else { return }
    print("跨线程访问: \(user.name)")
}

自动刷新

let config = Realm.Configuration(
    shouldCompactOnLaunch: { totalBytes, usedBytes in
        // 自动压缩逻辑
        return (usedBytes / totalBytes) < 0.5
    }
)

性能优化

写入优化

// 批量写入
try! realm.write {
    for data in jsonArray {
        realm.create(User.self, value: data)
    }
}

// 禁用自动刷新
autoreleasepool {
    let realm = try! Realm(autoRefresh: false)
    // 大量操作...
}

查询优化

技巧效果提升
使用索引字段查询速度↑300%
限制结果数量内存占用↓70%
延迟加载属性启动速度↑50%

实战案例

本地缓存实现

class CacheManager {
    static let shared = CacheManager()
    private var realm: Realm
    
    init() {
        realm = try! Realm(configuration: Realm.Configuration(
            fileURL: URL(fileURLWithPath: "cache.realm"),
            objectTypes: [CacheItem.self]
        ))
    }
    
    func save(data: Data, forKey key: String) {
        let item = CacheItem()
        item.key = key
        item.data = data
        try! realm.write {
            realm.add(item, update: .modified)
        }
    }
}

数据同步方案

// 配置Realm Sync
let app = App(id: "your-app-id")
let user = try await app.login(credentials: .anonymous)
let config = user.configuration(partitionValue: "user=\(user.id)")
let realm = try await Realm(configuration: config)

// 自动同步数据
let results = realm.objects(Post.self).filter("isPublished = true")
let token = results.observe { changes in
    // 数据变化回调
}

附录:常见问题

  1. 模型变更后崩溃
    必须进行数据迁移或删除旧数据库

  2. 跨线程访问崩溃
    使用ThreadSafeReference传递对象

  3. 性能下降
    检查是否在主线程执行大量写入

版本:RealmSwift 10.42.0
官方文档:realm.io/docs/swift/latest


这篇指南包含:
1. 从基础配置到高级特性的完整路径
2. 性能对比和优化建议
3. 多线程安全处理方案
4. 实战案例演示
5. 常见问题解决方案

推荐按照实际需求选择功能模块:
- 新项目:完整采用Realm方案
- 老项目:逐步替换Core Data模块
- 特殊需求:结合Realm Sync实现数据同步
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HiHi_Peter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值