java mutable 包装类_swift 3.0中realm封装类示例代码

前言

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

最新更新,特别感谢@deepindo

/// 查询排序后所有数据,关键词及是否升序

static func selectScoretByAll(_: T.Type ,key: String, isAscending: Bool) -> Results{

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(_ object: T) {

try! sharedInstance.write {

sharedInstance.add(object, update: true)

}

}

static func add(_ object: T) {

try! sharedInstance.write {

sharedInstance.add(object)

}

}

/// 后台单独进程写入一组数据

static func addListDataAsync(_ 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(_ 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(_ object: T) {

try! sharedInstance.write {

sharedInstance.delete(object)

}

}

/// 批量删除数据

static func delete(_ objects: [T]) {

try! sharedInstance.write {

sharedInstance.delete(objects)

}

}

/// 批量删除数据

static func delete(_ objects: List) {

try! sharedInstance.write {

sharedInstance.delete(objects)

}

}

/// 批量删除数据

static func delete(_ objects: Results) {

try! sharedInstance.write {

sharedInstance.delete(objects)

}

}

/// 批量删除数据

static func delete(_ objects: LinkingObjects) {

try! sharedInstance.write {

sharedInstance.delete(objects)

}

}

/// 删除所有数据。注意,Realm 文件的大小不会被改变,因为它会保留空间以供日后快速存储数据

static func deleteAll() {

try! sharedInstance.write {

sharedInstance.deleteAll()

}

}

/// 根据条件查询数据

static func selectByNSPredicate(_: T.Type , predicate: NSPredicate) -> Results{

return sharedInstance.objects(T.self).filter(predicate)

}

/// 后台根据条件查询数据

static func BGselectByNSPredicate(_: T.Type , predicate: NSPredicate) -> Results{

return try! Realm().objects(T.self).filter(predicate)

}

/// 查询所有数据

static func selectByAll(_: T.Type) -> Results{

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值