swift 3.0中realm封装类示例代码

前言

如果你用够了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 {
    // 处理错误
   }
  }

 }
}

总结

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

(0)

相关推荐

  • Swift利用AFN实现封装网络请求详解

    前言 相信大家都知道,我们一般在一个项目中,网络请求都封装成一个单例,以确保整个项目的网络请求 Session 是同一个. 单例模式定义:一个类有且仅有一个实例,并且自行实例化向整个系统提供,下面话不多说了,来一起看看详细的介绍吧. 通过cocoaPods 导入第三方框架 01-切换到项目目录 cd 项目名称 02-初始化Pods pod init 03-打开 Pods 文件 open Podfile 04-编辑 Podfile # 设置支持最低平台 platform :ios, '8.0' t

  • swift 3.0中realm封装类示例代码

    前言 如果你用够了FMDB或者CoreData,不妨试试realm,本文主要给大家介绍了关于swift 3.0中realm封装类的相关内容,分享出来供大家参考学习,下面来一起看看吧. 最新更新,特别感谢@deepindo /// 查询排序后所有数据,关键词及是否升序 static func selectScoretByAll<T: Object>(_: T.Type ,key: String, isAscending: Bool) -> Results<T>{ return

  • 在Linux中安装ASPNET.Core3.0运行时的示例代码

    # 以下示例适用于x64位runtime v3.0.0 mkdir /runtimes cd /runtimes wget https://download.visualstudio.microsoft.com/download/pr/b0c44e05-b7a1-4221-94ec-a0c0d3a11eed/afc61567dd6db8f097e244871889458c/aspnetcore-runtime-3.0.0-linux-x64.tar.gz mkdir aspnetcore-run

  • highcharts 在angular中的使用示例代码

    本文介绍了highcharts 在angular中的使用示例代码,分享给大家.具体如下: 网址 https://www.hcharts.cn/demo/highcharts https://github.com/pablojim/highcharts-ng 安装依赖 npm install highcharts-ng --save 引入依赖 'highcharts/highcharts.src.js', 'highcharts-ng/dist/highcharts-ng.min.js' 注入依赖

  • python golang中grpc 使用示例代码详解

    python 1.使用前准备,安装这三个库 pip install grpcio pip install protobuf pip install grpcio_tools 2.建立一个proto文件hello.proto // [python quickstart](https://grpc.io/docs/quickstart/python.html#run-a-grpc-application) // python -m grpc_tools.protoc --python_out=. -

  • vue3.0生命周期的示例代码

    在组件化的框架中,比如Angular.React或Vue,都为组件定义了生命周期这个概念,每个组件实例在被创建时都要经过一系列的初始化过程,例如:需要设置数据监听.编译模板.将实例挂载到 DOM 并在数据变化时更新 DOM 等.同时,在这个过程中也会运行一些叫做生命周期钩子的函数,它们提供给用户在组件的不同阶段添加自己的代码的机会. 使用过Vue2.x的朋友肯定对它的生命周期钩子很熟悉了,因为在实际的开发过程中我们多多少少会用到他们,比如 created.mounted.destoryed等等.

  • jackson 实现null转0 以及0转null的示例代码

    需求背景 最近遇到一个需求,有个数值类型的字段,非必填,默认为空,数据库表针对该字段设计的是一个int类型, 由于dba推荐规范,默认该值是not null.这个时候,问题就来了,数据库默认存的是0,前端展示时,又不能显示这个0(需要的是null) 解决方案 针对此类处理,通常的方案有以下2种: 前端做处理,统一对0和null做处理,0即是null,null即是0 后端做处理,针对要处理的字段,在序列化之前或者之后做处理,或者采取硬编码的方式,针对要处理的字段,写if else 方案分析 针对第

  • C#获取微信小程序的云数据库中数据的示例代码

    目录 0 背景说明 0.1 获取AccessToken 0.2 数据库查询 0.3 文件下载 2. 简单的封装 3. 简单测试 4. 参考文档 0 背景说明 试水小程序,实现访客登记,现有.NET程序需要获取该小程序的数据 0.1 获取AccessToken 调用绝大多数后台接口时都需使用 access_token 参考小程序文档:auth.getAccessToken 发送Get请求,获取AccessToken 接口: https://api.weixin.qq.com/cgi-bin/tok

  • Python实现识别图像中人物的示例代码

    目录 前言 环境部署 代码 总结 前言 接着上一篇:AI识别照片是谁,人脸识别face_recognition开源项目安装使用 根据项目提供的demo代码,调整了一下功能,自己写了一个识别人脸的工具代码. 环境部署 按照上一篇的安装部署就可以了. 代码 不废话,直接上代码. #!/user/bin/env python # coding=utf-8 """ @project : face_recognition @author : 剑客阿良_ALiang @file : te

  • JS中跳出循环的示例代码

    1.for循环中我们使用continue:终止本次循环计入下一个循环,使用break终止整个循环. 2.而在jquery中 $.each使用return true 终止本次循环计入下一个循环,return false终止整个循环.  函数返回值跟此处无关 例: $.extend($.fn.datagrid.methods, { isChecked: function (dg, param) { var flag = false;//是否选中 var allRows = $(dg).datagri

  • 封装一下vue中的axios示例代码详解

    在vue项目中,和后台交互获取数据这块,我们通常使用的是axios库,它是基于promise的http库,可运行在浏览器端和node.js中.他有很多优秀的特性,例如拦截请求和响应.取消请求.转换json.客户端防御cSRF等.所以我们的尤大大也是果断放弃了对其官方库vue-resource的维护,直接推荐我们使用axios库.如果还对axios不了解的,可以移步axios文档. 安装 npm install axios; // 安装axios 好了,下面开始今天的正文. 此次封装用以解决: (

随机推荐