前言
如果你用够了FMDB或者CoreData,不妨试试realm,本文主要给大家介绍了关于swift 3.0中realm封装类的相关内容,分享出来供大家参考学习,下面来一起看看吧。
最新更新,特别感谢@deepindo
1
2
3
4
|
/// 查询排序后所有数据,关键词及是否升序 static func selectScoretByAll<T: Object>(_: T.Type ,key: String, isAscending: Bool) -> Results<T>{ return sharedInstance.objects(T.self).sorted(byProperty: key, ascending: isAscending) } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
|
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 { // 处理错误 } } } } |
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:http://www.jianshu.com/p/e1ca8ee9554a