在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 先决条件
安装
入门如果您希望使用Objective-C中的 Realm ,或者使用混合的Objective-C和Swift应用程序,请参阅Realm Objective-C。Realm Objective-C和Realm Swift API不可互操作,不支持它们一起使用。 Realm Swift使您能够以安全,持久和快速的方式有效地编写应用程序的模型层。这是它的样子: 1 // Define your models like regular Swift classes 2 class Dog: Object { 3 @objc dynamic var name = "" 4 @objc dynamic var age = 0 5 } 6 class Person: Object { 7 @objc dynamic var name = "" 8 @objc dynamic var picture: Data? = nil // optionals supported 9 let dogs = List<Dog>() 10 } 11 12 // Use them like regular Swift objects 13 let myDog = Dog() 14 myDog.name = "Rex" 15 myDog.age = 1 16 print("name of dog: \(myDog.name)") 17 18 // Get the default Realm 19 let realm = try! Realm() 20 21 // Query Realm for all dogs less than 2 years old 22 let puppies = realm.objects(Dog.self).filter("age < 2") 23 puppies.count // => 0 because no dogs have been added to the Realm yet 24 25 // Persist your data easily 26 try! realm.write { 27 realm.add(myDog) 28 } 29 30 // Queries are updated in realtime 31 puppies.count // => 1 32 33 // Query and update from any thread 34 DispatchQueue(label: "background").async { 35 autoreleasepool { 36 let realm = try! Realm() 37 let theDog = realm.objects(Dog.self).filter("age == 1").first 38 try! realm.write { 39 theDog!.age = 3 40 } 41 } 42 } Realm StudioRealm Studio是我们的首选开发人员工具,可以轻松管理Realm数据库和Realm平台。使用Realm Studio,您可以打开和编辑本地和同步的域,并管理任何Realm Object Server实例。它支持Mac,Windows和Linux。 使用菜单项“ 工具”>“生成演示数据库”创建包含示例数据的测试数据库。 如果您在查找应用程序的Realm文件时需要帮助,请查看此StackOverflow答案以获取详细说明。 例子您可以在我们的发布zip下找到iOS和OS X的示例应用程序 使用Realm框架在Swift源文件的顶部,用于 tvOS因为在tvOS上禁止写入“Documents”目录,所以默认的Realm位置设置为 如果您想在tvOS应用程序和电视服务扩展(例如Top Shelf扩展)之间共享Realm文件,则必须使用 1 let fileURL = FileManager.default 2 .containerURL(forSecurityApplicationGroupIdentifier: "group.io.realm.examples.extension")! 3 .appendingPathComponent("Library/Caches/default.realm") 您还可以在应用中捆绑预构建的Realm文件。但是,请务必遵守App Store指南,将您的应用保持在200MB以下。请浏览我们的tvOS示例,了解示例如何使用Realm作为离线缓存或预加载数据的示例tvOS应用程序。 使用Realm与后台应用程序刷新在iOS 8及更高版本中, 为了解决这个问题,有必要确保应用于Realm文件本身及其辅助文件的文件保护属性降级为不太严格的文件保护属性,即使在设备被锁定时也允许文件访问,例如 如果您选择以这种方式选择退出完整的iOS文件加密,我们建议您使用Realm自己的内置加密来确保您的数据仍然得到妥善保护。 由于辅助文件有时可以在操作过程中延迟创建和删除,因此我们建议您将文件保护属性应用于包含这些Realm文件的父文件夹。这将确保该属性正确应用于所有相关Realm文件,无论其创建时间如何。 1 let realm = try! Realm() 2 3 // Get our Realm file's parent directory 4 let folderPath = realm.configuration.fileURL!.deletingLastPathComponent().path 5 6 // Disable file protection for this directory 7 try! FileManager.default.setAttributes([FileAttributeKey(rawValue: NSFileProtectionKey): NSFileProtectionNone], 8 ofItemAtPath: folderPath) 三界一个境界是一种境界移动数据库容器的一个实例。 有关Realms的详细讨论,请阅读The Realm Data Model。有关创建和管理领域的信息,请参阅 打开本地领域要打开Realm,请实例化一个新 1 let realm = try! Realm() 2 3 try! realm.write { 4 realm.add(myDog) 5 } 这会实例化默认的Realm。 配置本地领域通过创建实例 可以在 例如,假设您有一个应用程序,用户必须登录到您的Web后端,并且您希望支持在帐户之间快速切换。您可以通过执行以下操作为每个帐户提供自己的Realm文件,该文件将用作默认Realm: 1 func setDefaultRealmForUser(username: String) { 2 var config = Realm.Configuration() 3 4 // Use the default directory, but replace the filename with the username 5 config.fileURL = config.fileURL!.deletingLastPathComponent().appendingPathComponent("\(username).realm") 6 7 // Set this as the configuration used for the default Realm 8 Realm.Configuration.defaultConfiguration = config 9 } 您可以拥有多个配置对象,因此您可以独立控制每个Realm的版本,架构和位置。 1 let config = Realm.Configuration( 2 // Get the URL to the bundled file 3 fileURL: Bundle.main.url(forResource: "MyBundledData", withExtension: "realm"), 4 // Open the file in read-only mode as application bundles are not writeable 5 readOnly: true) 6 7 // Open the Realm with the configuration 8 let realm = try! Realm(configuration: config) 9 10 // Read some data from the bundled Realm 11 let results = realm.objects(Dog.self).filter("age > 5") 存储可写Realm文件的最常见位置是iOS上的“Documents”目录和macOS上的“Application Support”目录。请尊重Apple的iOS数据存储指南,该指南建议如果应用程序可以重新生成的文档应存储在 默认领域到目前为止,您可能已经注意到我们 打开同步领域您是否希望使用Realm Mobile Platform同步所有Realm数据库?所有与同步相关的文档已移至我们的平台文档中 内存领域通过设置 let realm = try! Realm(configuration: Realm.Configuration(inMemoryIdentifier: "MyInMemoryRealm")) 内存领域不会跨应用程序启动保存数据,但Realm的所有其他功能将按预期工作,包括查询,关系和线程安全。如果您需要灵活的数据访问而没有磁盘持久性的开销,这是一个有用的选项。 内存领域在临时目录中创建多个文件,用于协调跨进程通知等事务。实际上没有数据写入文件,除非由于内存压力操作系统需要交换到磁盘。 注意:当具有特定标识符的所有内存中Realm实例超出范围而没有引用时,该Realm中的所有数据都将被删除。我们建议您在应用程序的生命周期内保留对任何内存领域的强引用。(对于磁盘领域,这不是必需的。) 错误处理与任何磁盘I / O操作一样, 要在首次访问给定线程上的Realm时处理错误,请使用Swift的内置错误处理机制: 1 do { 2 let realm = try Realm() 3 } catch let error as NSError { 4 // handle error 5 } 辅助领域文件除标准
这些文件对 当报告领域的问题,请一定要包括这些辅助文件与主一起 捆绑一个境界通常使用初始数据为应用程序设定种子,使其在首次启动时立即可供您的用户使用。这是如何做到这一点:
您可以参考我们的迁移示例应用程序,以获取有关如何使用捆绑的Realm文件的示例。 类子集在某些情况下,您可能希望限制哪些类可以存储在特定领域中。例如,如果您有两个团队在应用程序的不同组件上工作,这两个组件都在内部使用Realm,那么您可能不希望必须协调它们之间的迁移。你可以通过设置 1 let config = Realm.Configuration(objectTypes: [MyClass.self, MyOtherClass.self]) 2 let realm = try! Realm(configuration: config) 压缩领域Realm的工作方式是Realm文件的大小始终大于存储在其中的对象的总大小。请参阅我们关于线程的文档,了解为什么这种架构能够实现Realm的一些出色性能,并发性和安全性优势。 为了避免进行昂贵的系统调用,Realm文件很少在运行时缩小。相反,它们以特定的大小增量增长,新数据被写入文件内跟踪的未使用空间内。但是,可能存在Realm文件的重要部分由未使用的空间组成的情况。为了解决这个问题,您可以 1 let config = Realm.Configuration(shouldCompactOnLaunch: { totalBytes, usedBytes in 2 // totalBytes refers to the size of the file on disk in bytes (data + free space) 3 // usedBytes refers to the number of bytes used by data in the file 4 5 // Compact if the file is over 100MB in size and less than 50% 'used' 6 let oneHundredMB = 100 * 1024 * 1024 7 return (totalBytes > oneHundredMB) && (Double(usedBytes) / Double(totalBytes)) < 0.5 8 }) 9 do { 10 // Realm is compacted on the first open if the configuration block conditions were met. 11 let realm = try Realm(configuration: config) 12 } catch { 13 // handle error compacting or opening Realm 14 } 压缩操作通过读取Realm文件的全部内容,将其重写到不同位置的新文件,然后替换原始文件来工作。根据文件中的数据量,这可能是一项昂贵的操作。 我们鼓励您尝试使用这些数字来确定在经常执行压缩和让Realm文件变得过大之间取得良好平衡。 最后,如果另一个进程正在访问Realm,即使满足配置块的条件,也会跳过压缩。这是因为在访问Realm时无法安全地执行压缩。
删除Realm文件在某些情况下,例如清除缓存或重置整个数据集,从磁盘中完全删除Realm文件可能是合适的。 因为Realm避免将数据复制到内存中,除非绝对需要,所以Realm管理的所有对象都包含对磁盘上文件的引用,并且必须先释放它才能安全删除文件。这包括从读取(或加入)的所有对象的境界,所有 实际上,这意味着删除Realm文件应该在应用程序启动之前在打开Realm之前完成,或者在仅在显式自动释放池中打开Realm之后完成,这样可以确保所有Realm对象都已被释放。 最后,虽然不是绝对必要,但您应该删除辅助Realm文件以及主Realm文件以完全清除所有相关文件。 1 autoreleasepool { 2 // all Realm usage here 3 } 4 let realmURL = Realm.Configuration.defaultConfiguration.fileURL! 5 let realmURLs = [ 6 realmURL, 7 realmURL.appendingPathExtension("lock"), 8 realmURL.appendingPathExtension("note"), 9 realmURL.appendingPathExtension("management") 10 ] 11 for URL in realmURLs { 12 do { 13 try FileManager.default.removeItem(at: URL) 14 } catch { 15 // handle error 16 } 17 } 楷模领域数据模型被定义为具有常规属性的常规Swift类。创建一个,只是子类 关系和嵌套的数据结构由包括目标类型的属性或建模 1 import RealmSwift 2 3 // Dog model 4 class Dog: Object { 5 @objc dynamic var name = "" 6 @objc dynamic var owner: Person? // Properties can be optional 7 } 8 9 // Person model 10 class Person: Object { 11 @objc dynamic var name = "" 12 @objc dynamic var birthdate = Date(timeIntervalSince1970: 1) 13 let dogs = List<Dog>() 14 } 由于Realm在启动时会解析代码中定义的所有模型,因此它们必须全部有效,即使它们从未使用过。 当使用Swift中的Realm时,该 有关详细信息,请参阅我们的API文档 支持的属性类型域支持以下属性类型:
必需的属性
1 class Person: Object { 2 // Optional string property, defaulting to nil 3 @objc dynamic var name: String? = nil 4 5 // Optional int property, defaulting to nil 6 // RealmOptional properties should always be declared with `let`, 7 // as assigning to them directly will not work as desired 8 let age = RealmOptional<Int>() 9 } 10 11 let realm = try! Realm() 12 try! realm.write() { 13 var person = realm.create(Person.self, value: ["Jane", 27]) 14 // Reading from or modifying a `RealmOptional` is done via the `value` property 15 person.age.value = 28 16 }
主键覆盖 1 class Person: Object { 2 @objc dynamic var id = 0 3 @objc dynamic var name = "" 4 5 override static func primaryKey() -> String? { 6 return "id" 7 } 8 } 索引属性要索引属性,请覆盖 1 class Book: Object { 2 @objc dynamic var price = 0 3 @objc dynamic var title = "" 4 5 override static func indexedProperties() -> [String] { 6 return ["title"] 7 } 8 } Realm支持对字符串,整数,布尔值和 忽略属性如果您不想将模型中的字段保存到其Realm,请覆盖 1 class Person: Object { 2 @objc dynamic var tmpID = 0 3 var name: String { // read-only properties are automatically ignored 4 return "\(firstName) \(lastName)" 5 } 6 @objc dynamic var firstName = "" 7 @objc dynamic var lastName = "" 8 9 override static func ignoredProperties() -> [String] { 10 return ["tmpID"] 11 } 12 } 忽略的属性与普通属性完全相同。它们不支持任何特定于Realm的功能(例如,它们不能在查询中使用,也不会触发通知)。仍然可以使用KVO观察它们。 属性属性领域模型属性必须具有该 有三种例外情况: 财产备忘单此表提供了声明模型属性的便捷参考。
使用Realm对象自动更新对象
1 let myDog = Dog() 2 myDog.name = "Fido" 3 myDog.age = 1 4 5 try! realm.write { 6 realm.add(myDog) 7 } 8 9 let myPuppy = realm.objects(Dog.self).filter("age == 1").first 10 try! realm.write { 11 myPuppy!.age = 2 12 } 13 14 print("age of my dog: \(myDog.age)") // => 2 这不仅可以保持Realm的快速和高效,还可以使您的代 |
请发表评论