swift 3.0中realm封装类示例代码

时间:2021-05-02

前言

如果你用够了FMDB或者CoreData,不妨试试realm,本文主要给大家介绍了关于swift 3.0中realm封装类的相关内容,分享出来供大家参考学习,下面来一起看看吧。

最新更新,特别感谢@deepindo

? 1 2 3 4 /// 查询排序后所有数据,关键词及是否升序 static func selectScoretByAll<T: Object>(_: T.Type ,key: String, isAscending: Bool) -> Results<T>{ return sharedInstance.objects(T.self).sorted(byProperty: key, ascending: isAscending) } ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 import UIKit import RealmSwift class ZYWRealm: NSObject { /// realm 数据库的名称 static let username = "MY-DB" static let sharedInstance = try! Realm() //--MARK: 初始化 Realm /// 初始化进过加密的 Realm, 加密过的 Realm 只会带来很少的额外资源占用(通常最多只会比平常慢10%) static func initEncryptionRealm() { // 说明: 以下内容是可以合并操作的,但为了能最大限度的展示各个操作内容,故分开设置 Realm // 产生随机密钥 var key = Data(count: 64) _ = key.withUnsafeMutableBytes {mutableBytes in SecRandomCopyBytes(kSecRandomDefault, key.count, mutableBytes) } // 获取加密 Realm 文件的配置文件 var config = Realm.Configuration(encryptionKey: key) // 使用默认的目录,但是使用用户名来替换默认的文件名 config.fileURL = config.fileURL!.deletingLastPathComponent().appendingPathComponent("\(username).realm") // 获取我们的 Realm 文件的父级目录 let folderPath = config.fileURL!.deletingLastPathComponent().path /** * 设置可以在后台应用刷新中使用 Realm * 注意:以下的操作其实是关闭了 Realm 文件的 NSFileProtection 属性加密功能,将文件保护属性降级为一个不太严格的、允许即使在设备锁定时都可以访问文件的属性 */ // 解除这个目录的保护 try! FileManager.default.setAttributes([FileAttributeKey.protectionKey: FileProtectionType.none], ofItemAtPath: folderPath) // 将这个配置应用到默认的 Realm 数据库当中 Realm.Configuration.defaultConfiguration = config } /// 初始化默认的 Realm static func initRealm() { var config = Realm.Configuration() // 使用默认的目录,但是使用用户名来替换默认的文件名 config.fileURL = config.fileURL!.deletingLastPathComponent().appendingPathComponent("\(username).realm") // 获取我们的 Realm 文件的父级目录 let folderPath = config.fileURL!.deletingLastPathComponent().path // 解除这个目录的保护 try! FileManager.default.setAttributes([FileAttributeKey.protectionKey: FileProtectionType.none], ofItemAtPath: folderPath) // 将这个配置应用到默认的 Realm 数据库当中 Realm.Configuration.defaultConfiguration = config } //--- MARK: 操作 Realm /// 做写入操作 static func doWriteHandler(_ clouse: @escaping ()->()) { // 这里用到了 Trailing 闭包 try! sharedInstance.write { clouse() } } ///后台做写入操作 static func BGDoWriteHandler(_ clouse: @escaping ()->()) { try! Realm().write { clouse() } } /// 添加一条数据 static func addCanUpdate<T: Object>(_ object: T) { try! sharedInstance.write { sharedInstance.add(object, update: true) } } static func add<T: Object>(_ object: T) { try! sharedInstance.write { sharedInstance.add(object) } } /// 后台单独进程写入一组数据 static func addListDataAsync<T: Object>(_ objects: [T]) { let queue = DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.default) // Import many items in a background thread queue.async { // 为什么添加下面的关键字,参见 Realm 文件删除的的注释 autoreleasepool { // 在这个线程中获取 Realm 和表实例 let realm = try! Realm() // 批量写入操作 realm.beginWrite() // add 方法支持 update ,item 的对象必须有主键 for item in objects { realm.add(item, update: true) } // 提交写入事务以确保数据在其他线程可用 try! realm.commitWrite() } } } static func addListData<T: Object>(_ objects: [T]) { autoreleasepool { // 在这个线程中获取 Realm 和表实例 let realm = try! Realm() // 批量写入操作 realm.beginWrite() // add 方法支持 update ,item 的对象必须有主键 for item in objects { realm.add(item, update: true) } // 提交写入事务以确保数据在其他线程可用 try! realm.commitWrite() } } /// 删除某个数据 static func delete<T: Object>(_ object: T) { try! sharedInstance.write { sharedInstance.delete(object) } } /// 批量删除数据 static func delete<T: Object>(_ objects: [T]) { try! sharedInstance.write { sharedInstance.delete(objects) } } /// 批量删除数据 static func delete<T: Object>(_ objects: List<T>) { try! sharedInstance.write { sharedInstance.delete(objects) } } /// 批量删除数据 static func delete<T: Object>(_ objects: Results<T>) { try! sharedInstance.write { sharedInstance.delete(objects) } } /// 批量删除数据 static func delete<T: Object>(_ objects: LinkingObjects<T>) { try! sharedInstance.write { sharedInstance.delete(objects) } } /// 删除所有数据。注意,Realm 文件的大小不会被改变,因为它会保留空间以供日后快速存储数据 static func deleteAll() { try! sharedInstance.write { sharedInstance.deleteAll() } } /// 根据条件查询数据 static func selectByNSPredicate<T: Object>(_: T.Type , predicate: NSPredicate) -> Results<T>{ return sharedInstance.objects(T.self).filter(predicate) } /// 后台根据条件查询数据 static func BGselectByNSPredicate<T: Object>(_: T.Type , predicate: NSPredicate) -> Results<T>{ return try! Realm().objects(T.self).filter(predicate) } /// 查询所有数据 static func selectByAll<T: Object>(_: T.Type) -> Results<T>{ return sharedInstance.objects(T.self) } //--- MARK: 删除 Realm /// Realm 文件删除操作 static func deleteRealmFile() { let realmURL = Realm.Configuration.defaultConfiguration.fileURL! let realmURLs = [ realmURL, realmURL.appendingPathExtension("lock"), realmURL.appendingPathExtension("log_a"), realmURL.appendingPathExtension("log_b"), realmURL.appendingPathExtension("note") ] let manager = FileManager.default for URL in realmURLs { do { try manager.removeItem(at: URL) } catch { // 处理错误 } } } }

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。

原文链接:http://www.jianshu.com/p/e1ca8ee9554a

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章