[!警告] 我们已于2024 9 月宣布弃用Atlas Device Sync + Realm SDK。 更多信息,请参阅:

对于没有同步功能的realm-swift版本,请安装20版本或参阅community分支。

Realm by MongoDB

关于 Realm 数据库

Realm 是一种移动数据库,可直接在手机、平板电脑或可穿戴设备中运行。 此存储库包含 Realm Swift 和 Realm Objective-C 的 iOS、macOS、tvOS 和 watchOS 版本的源代码。

为何使用 Realm

  • 对开发者来说直观: Realm 的对象 Realm 数据模型易于学习,不需要 ORM,可以减少编写的代码。
  • 专为移动设备打造: Realm 功能齐全、轻量级,可高效利用内存、磁盘空间和电池寿命。
  • 专为离线使用而设计: Realm 的本地数据库会在磁盘上持久保存数据,因此应用程序离线运行与在线运行一样顺畅。
  • MongoDB Atlas Device Sync :轻松实现跨用户、设备和后端的数据实时同步。 免费开始使用模板应用程序创建云后端

面向对象:简化代码

Realm 专为移动开发者构建,注重简单性。 这种惯用的面向对象的Realm 数据模型可以节省数千行代码。

// Define your models like regular Swift classes
class Dog: Object {
    @Persisted var name: String
    @Persisted var age: Int
}
class Person: Object {
    @Persisted(primaryKey: true) var _id: String
    @Persisted var name: String
    @Persisted var age: Int
    // Create relationships by pointing an Object field to another Class
    @Persisted var dogs: List<Dog>
}
// Use them like regular Swift objects
let dog = Dog()
dog.name = "Rex"
dog.age = 1
print("name of dog: \(dog.name)")

// Get the default Realm
let realm = try! Realm()
// Persist your data easily with a write transaction
try! realm.write {
    realm.add(dog)
}

活动对象:构建响应式应用

Realm 的对象平均值在任何地方更新的数据都会在任何地方自动更新。

// Open the default realm.
let realm = try! Realm()

var token: NotificationToken?

let dog = Dog()
dog.name = "Max"

// Create a dog in the realm.
try! realm.write {
    realm.add(dog)
}

//  Set up the listener & observe object notifications.
token = dog.observe { change in
    switch change {
    case .change(let properties):
        for property in properties {
            print("Property '\(property.name)' changed to '\(property.newValue!)'");
        }
    case .error(let error):
        print("An error occurred: (error)")
    case .deleted:
        print("The object was deleted.")
    }
}

// Update the dog's name to see the effect.
try! realm.write {
    dog.name = "Wolfie"
}

SwiftUI

Realm 直接与 SwiftUI 集成,从而无需您更新视图。

struct ContactsView: View {
    @ObservedResults(Person.self) var persons

    var body: some View {
        List {
            ForEach(persons) { person in
                Text(person.name)
            }
            .onMove(perform: $persons.move)
            .onDelete(perform: $persons.remove)
        }.navigationBarItems(trailing:
            Button("Add") {
                $persons.append(Person())
            }
        )
    }
}

完全加密

可以对动态和静态数据进行加密,即使是最敏感的数据也能保持安全。

// Generate a random encryption key
var key = Data(count: 64)
_ = key.withUnsafeMutableBytes { (pointer: UnsafeMutableRawBufferPointer) in
    guard let baseAddress = pointer.baseAddress else {
        fatalError("Failed to obtain base address")
    }
    SecRandomCopyBytes(kSecRandomDefault, 64, baseAddress)
}

// Add the encryption key to the config and open the realm
let config = Realm.Configuration(encryptionKey: key)
let realm = try Realm(configuration: config)

// Use the Realm as normal
let dogs = realm.objects(Dog.self).filter("name contains 'Fido'")

开始体验

我们支持通过 Swift 包 经理、CocoaPods、Carthage 或导入动态 XCFramework 来安装 Realm。

有关更多信息,请参阅我们文档中的详细说明。

有兴趣免费开始使用包含云后端和 Sync的模板应用程序吗? 创建 MongoDB Atlas 帐户

文档

该文档位于mongodb.com/zh-cn/docs/atlas/device-sdks/sdk/swift/ 。 API 参考位于mongodb.com/zh-cn/docs/realm-sdks/swift/latest/

获取帮助

  • 需要代码方面的帮助? :在 Stack Overflow 上查找带有realm标签的以往问题或提出新问题。 对于对于 Stack Overflow 来说可能被认为过于宽泛的一般性讨论,请使用社区论坛
  • 有错误要报告? 打开 GitHub 问题。 如果可能,请包含 Realm 的版本、完整日志、Realm 文件以及显示问题的项目。
  • 有功能请求? 打开 GitHub 问题。 告诉我们该功能应该做什么以及您为什么需要该功能。

构建 Realm

如果您不想使用预编译版本,则可以从源代码自行构建 Realm。

先决条件:

  • 构建 Realm 需要 Xcode 14.1 或更高版本。
  • 构建 Realm 文档需要使用 jazi

具备所有必要的先决条件后,只需执行一条命令sh build.sh build即可构建 Realm。 首次构建 Realm 时,您需要连接互联网来下载核心二进制文件。 这将在build/Release/中生成 Realm.xcframework 和 RealmSwift.xcframework。

运行sh build.sh help以查看可以执行的所有操作(构建 ios/osx、生成文档、测试等)。

贡献

有关更多详细信息,请参阅CONTRIBUTING.md

Code of Conduct

该项目遵守MongoDB 行为准则。 参与即表示您遵守本准则。 请将不可接受的行为发送至Community-conduct@mongodb.com

许可证

Realm Objective-C 和 Realm Swift 根据 Apache 2.0许可证发布。 Realm Core 也根据 Apache 2.0许可证发布,可在此处获取。

反馈

如果您使用 Realm 并对它感到满意,请考虑发送提及@realm的推文来分享您的想法!

如果您不喜欢它,请告诉我们您希望改进什么,以便我们修复它!