前言
如果你用夠了FMDB或者CoreData,不妨試試realm,本文主要給大家介紹了關于swift/172286.html">swift 3.0中realm封裝類的相關內容,分享出來供大家參考學習,下面來一起看看吧。
最新更新,特別感謝@deepindo
/// 查詢排序后所有數據,關鍵詞及是否升序 static func selectScoretByAll<T: Object>(_: T.Type ,key: String, isAscending: Bool) -> Results<T>{ return sharedInstance.objects(T.self).sorted(byProperty: key, ascending: isAscending) }
import UIKitimport RealmSwiftclass 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 /* 參考官方文檔,所有 fileURL 指向想要刪除的 Realm 文件的 Realm 實例,都必須要在刪除操作執行前被釋放掉。 故在操作 Realm實例的時候需要加上 autoleasepool 。如下: autoreleasepool { //所有 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 { // 處理錯誤 } } }}
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。
新聞熱點
疑難解答