swift 3.0中realm封裝類示例代碼
前言
如果你用夠了FMDB或者CoreData,不妨試試realm,本文主要給大家介紹了關(guān)于swift 3.0中realm封裝類的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面來(lái)一起看看吧。
最新更新,特別感謝@deepindo
/// 查詢排序后所有數(shù)據(jù),關(guān)鍵詞及是否升序 static func selectScoretByAll<T: Object>(_: T.Type ,key: String, isAscending: Bool) -> Results<T>{ return sharedInstance.objects(T.self).sorted(byProperty: key, ascending: isAscending) }
import UIKit import RealmSwift class ZYWRealm: NSObject { /// realm 數(shù)據(jù)庫(kù)的名稱 static let username = "MY-DB" static let sharedInstance = try! Realm() //--MARK: 初始化 Realm /// 初始化進(jìn)過(guò)加密的 Realm, 加密過(guò)的 Realm 只會(huì)帶來(lái)很少的額外資源占用(通常最多只會(huì)比平常慢10%) static func initEncryptionRealm() { // 說(shuō)明: 以下內(nèi)容是可以合并操作的,但為了能最大限度的展示各個(gè)操作內(nèi)容,故分開(kāi)設(shè)置 Realm // 產(chǎn)生隨機(jī)密鑰 var key = Data(count: 64) _ = key.withUnsafeMutableBytes {mutableBytes in SecRandomCopyBytes(kSecRandomDefault, key.count, mutableBytes) } // 獲取加密 Realm 文件的配置文件 var config = Realm.Configuration(encryptionKey: key) // 使用默認(rèn)的目錄,但是使用用戶名來(lái)替換默認(rèn)的文件名 config.fileURL = config.fileURL!.deletingLastPathComponent().appendingPathComponent("\(username).realm") // 獲取我們的 Realm 文件的父級(jí)目錄 let folderPath = config.fileURL!.deletingLastPathComponent().path /** * 設(shè)置可以在后臺(tái)應(yīng)用刷新中使用 Realm * 注意:以下的操作其實(shí)是關(guān)閉了 Realm 文件的 NSFileProtection 屬性加密功能,將文件保護(hù)屬性降級(jí)為一個(gè)不太嚴(yán)格的、允許即使在設(shè)備鎖定時(shí)都可以訪問(wèn)文件的屬性 */ // 解除這個(gè)目錄的保護(hù) try! FileManager.default.setAttributes([FileAttributeKey.protectionKey: FileProtectionType.none], ofItemAtPath: folderPath) // 將這個(gè)配置應(yīng)用到默認(rèn)的 Realm 數(shù)據(jù)庫(kù)當(dāng)中 Realm.Configuration.defaultConfiguration = config } /// 初始化默認(rèn)的 Realm static func initRealm() { var config = Realm.Configuration() // 使用默認(rèn)的目錄,但是使用用戶名來(lái)替換默認(rèn)的文件名 config.fileURL = config.fileURL!.deletingLastPathComponent().appendingPathComponent("\(username).realm") // 獲取我們的 Realm 文件的父級(jí)目錄 let folderPath = config.fileURL!.deletingLastPathComponent().path // 解除這個(gè)目錄的保護(hù) try! FileManager.default.setAttributes([FileAttributeKey.protectionKey: FileProtectionType.none], ofItemAtPath: folderPath) // 將這個(gè)配置應(yīng)用到默認(rèn)的 Realm 數(shù)據(jù)庫(kù)當(dāng)中 Realm.Configuration.defaultConfiguration = config } //--- MARK: 操作 Realm /// 做寫入操作 static func doWriteHandler(_ clouse: @escaping ()->()) { // 這里用到了 Trailing 閉包 try! sharedInstance.write { clouse() } } ///后臺(tái)做寫入操作 static func BGDoWriteHandler(_ clouse: @escaping ()->()) { try! Realm().write { clouse() } } /// 添加一條數(shù)據(jù) 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) } } /// 后臺(tái)單獨(dú)進(jìn)程寫入一組數(shù)據(jù) static func addListDataAsync<T: Object>(_ objects: [T]) { let queue = DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.default) // Import many items in a background thread queue.async { // 為什么添加下面的關(guān)鍵字,參見(jiàn) Realm 文件刪除的的注釋 autoreleasepool { // 在這個(gè)線程中獲取 Realm 和表實(shí)例 let realm = try! Realm() // 批量寫入操作 realm.beginWrite() // add 方法支持 update ,item 的對(duì)象必須有主鍵 for item in objects { realm.add(item, update: true) } // 提交寫入事務(wù)以確保數(shù)據(jù)在其他線程可用 try! realm.commitWrite() } } } static func addListData<T: Object>(_ objects: [T]) { autoreleasepool { // 在這個(gè)線程中獲取 Realm 和表實(shí)例 let realm = try! Realm() // 批量寫入操作 realm.beginWrite() // add 方法支持 update ,item 的對(duì)象必須有主鍵 for item in objects { realm.add(item, update: true) } // 提交寫入事務(wù)以確保數(shù)據(jù)在其他線程可用 try! realm.commitWrite() } } /// 刪除某個(gè)數(shù)據(jù) static func delete<T: Object>(_ object: T) { try! sharedInstance.write { sharedInstance.delete(object) } } /// 批量刪除數(shù)據(jù) static func delete<T: Object>(_ objects: [T]) { try! sharedInstance.write { sharedInstance.delete(objects) } } /// 批量刪除數(shù)據(jù) static func delete<T: Object>(_ objects: List<T>) { try! sharedInstance.write { sharedInstance.delete(objects) } } /// 批量刪除數(shù)據(jù) static func delete<T: Object>(_ objects: Results<T>) { try! sharedInstance.write { sharedInstance.delete(objects) } } /// 批量刪除數(shù)據(jù) static func delete<T: Object>(_ objects: LinkingObjects<T>) { try! sharedInstance.write { sharedInstance.delete(objects) } } /// 刪除所有數(shù)據(jù)。注意,Realm 文件的大小不會(huì)被改變,因?yàn)樗鼤?huì)保留空間以供日后快速存儲(chǔ)數(shù)據(jù) static func deleteAll() { try! sharedInstance.write { sharedInstance.deleteAll() } } /// 根據(jù)條件查詢數(shù)據(jù) static func selectByNSPredicate<T: Object>(_: T.Type , predicate: NSPredicate) -> Results<T>{ return sharedInstance.objects(T.self).filter(predicate) } /// 后臺(tái)根據(jù)條件查詢數(shù)據(jù) static func BGselectByNSPredicate<T: Object>(_: T.Type , predicate: NSPredicate) -> Results<T>{ return try! Realm().objects(T.self).filter(predicate) } /// 查詢所有數(shù)據(jù) static func selectByAll<T: Object>(_: T.Type) -> Results<T>{ return sharedInstance.objects(T.self) } //--- MARK: 刪除 Realm /* 參考官方文檔,所有 fileURL 指向想要?jiǎng)h除的 Realm 文件的 Realm 實(shí)例,都必須要在刪除操作執(zhí)行前被釋放掉。 故在操作 Realm實(shí)例的時(shí)候需要加上 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 { // 處理錯(cuò)誤 } } } }
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Swift實(shí)現(xiàn)表格視圖單元格單選(2)
這篇文章主要為大家詳細(xì)介紹了Swift實(shí)現(xiàn)表格視圖單元格單選的第二篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01swift5.3 UIColor使用十六進(jìn)制顏色的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于swift5.3 UIColor使用十六進(jìn)制顏色的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Swift、Objective-C、Cocoa混合編程設(shè)置指南
這篇文章主要介紹了Swift、Objective-C、Cocoa混合編程設(shè)置指南,需要的朋友可以參考下2014-07-07swift中defer的實(shí)際應(yīng)用小結(jié)
這篇文章主要給大家介紹了關(guān)于swift中defer的實(shí)際應(yīng)用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Swift5中fileprivate與private的差別淺析
這篇文章主要給大家介紹了關(guān)于Swift5中fileprivate與private的差別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Swift5具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Swift 3.0基礎(chǔ)學(xué)習(xí)之閉包
Swift引進(jìn)了閉包的概念,這個(gè)與object-c的block類似,使用過(guò)block的話都知道有多方便,所以開(kāi)始學(xué)Swift,先要把閉包學(xué)會(huì),后面使用會(huì)很頻繁。下面這篇文章主要介紹了Swift 3.0基礎(chǔ)學(xué)習(xí)之閉包的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-03-03swift指針及內(nèi)存管理內(nèi)存綁定實(shí)例詳解
這篇文章主要為大家介紹了swift指針及內(nèi)存管理內(nèi)存綁定實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Swift實(shí)現(xiàn)監(jiān)聽(tīng)鍵盤通知及一些處理詳解
這篇文章主要給大家介紹了關(guān)于Swift實(shí)現(xiàn)監(jiān)聽(tīng)鍵盤通知及一些處理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01