警告
我们已宣布 Atlas Device Sync + Realm SDK 将于 2024 年 9 月弃用。有关更多信息,请参阅
要获取不带同步功能的 realm-swift
版本,请安装版本 20 或查看 community
分支。
Realm 是一款移动数据库,可直接在手机、平板电脑或可穿戴设备中运行。此存储库包含适用于 Realm Swift 和 Realm Objective-C 的 iOS、macOS、tvOS 和 watchOS 版本的源代码。
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"
}
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 Package Manager、CocoaPods、Carthage 或导入动态 XCFramework 安装 Realm。
有关更多信息,请参阅我们的文档中的详细说明。
有兴趣通过包含云后端和 Sync 的模板应用程序免费开始使用吗?创建 MongoDB Atlas 账户。
文档位于 mongodb.com/docs/atlas/device-sdks/sdk/swift/。API 参考位于 mongodb.com/docs/realm-sdks/swift/latest/
realm
标签的先前问题,或提出新问题。对于可能被认为对 Stack Overflow 来说过于宽泛的通用讨论,请使用社区论坛。如果您不想使用预编译版本,可以从源代码自行构建 Realm。
前提条件
一旦您具备所有必要的前提条件,构建 Realm 只需一个命令:sh build.sh build
。首次构建 Realm 时,您需要连接互联网以下载核心二进制文件。这将在 build/Release/
中生成 Realm.xcframework 和 RealmSwift.xcframework。
运行 sh build.sh help
以查看您可以执行的所有操作(构建 ios/osx、生成文档、测试等)。
有关更多详细信息,请参阅 CONTRIBUTING.md!
本项目遵守 MongoDB 行为准则。参与本项目,即表示您需要遵守此准则。请将不可接受的行为报告给 community-conduct@mongodb.com。
Realm Objective-C 和 Realm Swift 在 Apache 2.0 许可证下发布。Realm Core 也在 Apache 2.0 许可证下发布,并在此处提供。
如果您使用 Realm 并且对此感到满意,请考虑发送一条推文提及 @realm 以分享您的想法!
如果您不喜欢它,请告诉我们您希望改进哪些方面,以便我们进行修复!