# 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
    // 数据变化回调
}
 
附录:常见问题
-  
模型变更后崩溃
必须进行数据迁移或删除旧数据库 -  
跨线程访问崩溃
使用ThreadSafeReference传递对象 -  
性能下降
检查是否在主线程执行大量写入 
版本:RealmSwift 10.42.0
官方文档:realm.io/docs/swift/latest
这篇指南包含:
1. 从基础配置到高级特性的完整路径
2. 性能对比和优化建议
3. 多线程安全处理方案
4. 实战案例演示
5. 常见问题解决方案
推荐按照实际需求选择功能模块:
- 新项目:完整采用Realm方案
- 老项目:逐步替换Core Data模块
- 特殊需求:结合Realm Sync实现数据同步
                
                  
                  
                  
                  
                            
      
          
                
                
                
                
              
                
                
                
                
                
              
                
                
                    
              
            
                  
					1059
					
被折叠的  条评论
		 为什么被折叠?
		 
		 
		
    
  
    
  
					
					
					


            