swift 3.0中realm封装类示例代码

 更新时间:2017年10月13日 11:48:04   作者:迷路的洞二  
这篇文章主要给大家介绍了关于swift 3.0中realm封装类的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用swift具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

前言

如果你用够了FMDB或者CoreData,不妨试试realm,本文主要给大家介绍了关于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 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
 /*
  参考官方文档,所有 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 {
    // 处理错误
   }
  }
  
 }
}

总结

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

您可能感兴趣的文章:

相关文章

  • Swift循环遍历集合的方法总结分享

    Swift循环遍历集合的方法总结分享

    SWIFT是苹果于2014年WWDC发布的新开发语言,可与Objective-C*共同运行于Mac OS和iOS平台,用于搭建基于苹果平台的应用程序。这篇文章主要给大家总结介绍了关于Swift循环遍历集合的方法,如for-in循环、for循环以及基于块的遍历等方法,需要的朋友可以参考下。
    2017-03-03
  • Swift编程之枚举类型详解

    Swift编程之枚举类型详解

    这篇文章主要介绍了Swift编程之枚举类型,讲解了枚举语法、匹配枚举值与switch语句、关联值、原始值等内容,Swift中枚举类型是最重要的类型,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • Swift算法实现字符串转数字的方法示例

    Swift算法实现字符串转数字的方法示例

    最近学完了swift想着实践下,就通过一些简单的算法进行学习研究,下面这篇文章主要介绍了Swift算法实现字符串转数字的方法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-03-03
  • swift 3.0中realm封装类示例代码

    swift 3.0中realm封装类示例代码

    这篇文章主要给大家介绍了关于swift 3.0中realm封装类的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用swift具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-10-10
  • Swift实现简单计算器

    Swift实现简单计算器

    这篇文章主要为大家详细介绍了Swift实现简单计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Swift NavigationBar隐藏后的右滑手势效果

    Swift NavigationBar隐藏后的右滑手势效果

    这篇文章主要为大家详细介绍了Swift NavigationBar隐藏后的右滑手势效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Swift中定义二维数组的方法及遍历方法示例

    Swift中定义二维数组的方法及遍历方法示例

    这篇文章主要介绍了Swift中定义二维数组的方法及遍历方法示例,本文直接给出代码示例,需要的朋友可以参考下
    2015-07-07
  • Swift 基本数据类型详解总结

    Swift 基本数据类型详解总结

    在我们使用任何程序语言编程时,需要使用各种数据类型来存储不同的信息。变量的数据类型决定了如何将代表这些值的位存储到计算机的内存中。在声明变量时也可指定它的数据类型。所有变量都具有数据类型,以决定能够存储哪种数据
    2021-11-11
  • 详解Swift编程中的方法与属性的概念

    详解Swift编程中的方法与属性的概念

    这篇文章主要介绍了Swift编程中的方法与属性的概念,是Swift入门学习中的基础知识,需要的朋友可以参考下
    2015-11-11
  • swift中defer的实际应用小结

    swift中defer的实际应用小结

    这篇文章主要给大家介绍了关于swift中defer的实际应用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论