关于 Realm 数据库
Realm 是一款可直接运行在手机、平板电脑或可穿戴设备中的移动数据库。 本仓库包含 Realm Swift 和 Realm Objective-C 的 iOS、macOS、tvOS 和 watchOS 版本的源代码。
为什么使用 Realm
- 对开发者直观易用: Realm 的面向对象数据模型易于学习,无需 ORM,并且能让你编写更少的代码。
- 专为移动设备打造: Realm 功能齐全、轻量级,并高效利用内存、磁盘空间和电池寿命。
- 专为离线使用设计: 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 Package Manager、CocoaPods、Carthage 或导入动态 XCFramework 来安装 Realm。
更多信息,请参阅我们的 快速入门。
文档
文档可以在 docs/ 目录中找到。
API 参考文档可以使用
jazzy 通过在本仓库根目录运行 sh build.sh docs 从源代码生成。
获取帮助
- 需要代码方面的帮助?: 在 Stack Overflow 上查找带有
realm标签 的过往问题,或提出一个新问题。对于可能被认为对 Stack Overflow 而言过于宽泛的一般性讨论,请使用社区论坛。 - 有 bug 需要报告? 在 GitHub 上提交 issue。如果可能,请包含 Realm 的版本、完整的日志、Realm 文件以及一个展示该问题的项目。
- 有功能请求? 在 GitHub 上提交 issue。告诉我们该功能应该做什么以及你为什么想要这个功能。
构建 Realm
如果你不想使用预编译版本,你可以从源代码自行构建 Realm。
先决条件:
- 构建 Realm 需要 Xcode 15.3 或更高版本。
- 构建 Realm 文档需要 jazzy
一旦你拥有了所有必要的先决条件,构建 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。
License
Realm Objective-C 和 Realm Swift 依据 Apache 2.0 许可证发布。 Realm Core 同样依据 Apache 2.0 许可证发布,并可在 此处获取。
Feedback
如果您使用 Realm 并且感到满意,请考虑发布一条提及 @realm 的推文来分享您的想法!
如果您不满意,请告诉我们您希望改进的地方,以便我们进行修复!