广告位联系
返回顶部
分享到

入门教程:swift 3.0中realm封装类示例代码

asp.net 来源:互联网 作者:酷站 发布时间:2018-06-28 15:53:03 人浏览
摘要

如果你用够了FMDB或者CoreData,不妨试试realm,本文主要给大家介绍了关于swift 3.0中realm封装类的相关内容,分享出来供大家参考学习,下面来一起看看吧。 asp教程 /// 查询排序后所有数据,关键词及是否升序static func selectScoretByAllT: Object(_: T.Ty

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

/// 查询排序后所有数据,关键词及是否升序
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 {
    // 处理错误
   }
  }
   
 }
}


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • ASP.NET MVC使用Identity增删改查用户

    ASP.NET MVC使用Identity增删改查用户
    源码在这里:https://github.com/darrenji/UseIdentityCRUDUserInMVC,本地下载 在VS2013中创建一个MVC项目,用默认的无身份验证作为身份验证机制。 通过
  • WPF实现雷达扫描图的绘制介绍

    WPF实现雷达扫描图的绘制介绍
    实现一个雷达扫描图。 源代码在TK_King/雷达 (gitee.com) https://gitee.com/TK_King/radar,自行下载就好了 制作思路 绘制圆形(或者称之轮) 绘制分割
  • .Net Core之JWT授权介绍

    .Net Core之JWT授权介绍
    JSON Web令牌(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为JSON对象。由于此信息
  • ASP.NET Core使用Middleware设置有条件允许访问路由

    ASP.NET Core使用Middleware设置有条件允许访问路由
    1.简介 有时,我们可能在Web API中包含一些具有调试功能的请求。比如我们上次的文章中为什么ASP.NETCore数据库连接串的值和appsettings.json配的
  • ASP.NET Core使用功能开关控制路由访问操作

    ASP.NET Core使用功能开关控制路由访问操作
    前言: 在前面的文章,我们介绍了使用Middleware有条件地允许访问路由(《ASP.NETCore使用Middleware设置有条件允许访问路由》)。 而对于一些
  • ASP.NET Core使用功能开关控制路由访问操作(续)

    ASP.NET Core使用功能开关控制路由访问操作(续)
    前言: 在前面的文章,我们介绍了? ?使用功能开关控制路由访问??。 但其实我们使用了2个条件做的判断: 1 2 3 4 var isDebugEndpoint = context.Re
  • 详解MediatR的使用
    环境: .NET 5 ASP.NET Core MVC (project) 1. MediatR MediatR .NET中的简单中介者模式实现,一种进程内消息传递机制(无其他外部依赖)。支持以同步或
  • .NET Core 3.0里新的JSON API介绍
    为什么需要新的 JSON API ? JSON.NET 大家都用过,老版本的 ASP.NET Core 也依赖于 JSON.NET 。 然而这个依赖就会引起一些版本问题:例如 ASP .NET
  • Net Core Web Api项目与在NginX下发布的方法
    前言 本文将介绍Net Core的一些基础知识和如何NginX下发布Net Core的WebApi项目。 测试环境 操作系统:windows 10 开发工具:visualstudio 2019 框架:
  • ASP.NET Core中的Http缓存使用
    Http响应缓存可减少客户端或代理对web服务器发出的请求数。响应缓存还减少了web服务器生成响应所需的工作量。响应缓存由Http请求中的he
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计