PQSingletoRealmUtil.swift 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482
  1. //
  2. // PQSingletoRealmUtil.swift
  3. // PQSpeed
  4. //
  5. // Created by SanW on 2020/7/7.
  6. // Copyright © 2020 BytesFlow. All rights reserved.
  7. //
  8. import RealmSwift
  9. import UIKit
  10. import BFCommonKit
  11. public class PQSingletoRealmUtil: NSObject {
  12. public var schemaVersion : UInt64 = 32
  13. public var realmEntry: Realm? {
  14. let config = Realm.Configuration(
  15. schemaVersion: schemaVersion,
  16. migrationBlock: { _, oldSchemaVersion in
  17. if oldSchemaVersion < 1 {}
  18. }
  19. )
  20. Realm.Configuration.defaultConfiguration = config
  21. do {
  22. let realmEntry = try Realm(configuration: config, queue: DispatchQueue.main)
  23. return realmEntry
  24. } catch let error as NSError {
  25. // handle error
  26. BFLog(message: "Realm-realm创建失败:\(error)")
  27. }
  28. return nil
  29. }
  30. public static let shared = PQSingletoRealmUtil()
  31. // 根据不同的用户ID 初始化不同的数据库 th1
  32. public func getDraftDB(uid: String) -> Realm {
  33. let docPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0] as String
  34. let dbPath = docPath.appending("/\(uid)Draft.realm")
  35. BFLog(message: "生成登录人数据库地址\(dbPath)")
  36. var config = Realm.Configuration(
  37. schemaVersion: schemaVersion,
  38. migrationBlock: { _, oldSchemaVersion in
  39. if oldSchemaVersion < 1 {}
  40. }
  41. )
  42. config.fileURL = URL(string: dbPath)!
  43. let defaultRealm = try! Realm(configuration: config)
  44. return defaultRealm
  45. }
  46. /// 写入单个数据
  47. /// - Parameter objects: <#objects description#>
  48. /// - Returns: <#description#>
  49. public func saveObject(object: Object) {
  50. do {
  51. try realmEntry?.write {
  52. realmEntry?.add(object, update: .modified)
  53. BFLog(message: "Realm-添加单个数据成功:\(object)")
  54. }
  55. } catch let error as NSError {
  56. // handle error
  57. BFLog(message: "Realm-添加单个数据失败:\(error)")
  58. }
  59. }
  60. /// 写入多个数据
  61. /// - Parameter objects: <#objects description#>
  62. /// - Returns: <#description#>
  63. public func saveObjects(objects: [Object]) {
  64. do {
  65. try realmEntry?.write {
  66. realmEntry?.add(objects, update: .modified)
  67. BFLog(message: "Realm-添加多个数据成功:\(objects)")
  68. }
  69. } catch let error as NSError {
  70. // handle error
  71. BFLog(message: "Realm-添加多个数据失败:\(error)")
  72. }
  73. }
  74. /// 写入本地存储数据
  75. /// - Parameter objects: <#objects description#>
  76. /// - Returns: <#description#>
  77. public func saveLocalSaveObject(uniqueId: String, isSelected: Bool) {
  78. let currentObject = queryLocalStoreObjects(uniqueId: uniqueId)
  79. if (currentObject?.count ?? 0) > 0 {
  80. do {
  81. try realmEntry?.write {
  82. currentObject?.first?.isSelected = isSelected
  83. (currentObject?.first as? PQLocalStoreModel)?.currentDate = systemCurrentDate()
  84. BFLog(message: "Realm-本地已存储数据更新成功:\(currentObject)")
  85. }
  86. } catch let error as NSError {
  87. // handle error
  88. BFLog(message: "Realm-本地已存储数据更新失败:\(error)")
  89. }
  90. } else {
  91. let storeObject = PQLocalStoreModel()
  92. storeObject.uniqueId = uniqueId
  93. storeObject.isSelected = isSelected
  94. // 未存在则保存
  95. BFLog(message: "Realm-本地数据未存储,开始存储")
  96. saveObject(object: storeObject)
  97. }
  98. }
  99. /// 查询本地缓存数据
  100. /// - Returns: <#description#>
  101. public func queryLocalStoreObjects(uniqueId: String) -> Results<PQBaseModel>? {
  102. return queryObjects(PQLocalStoreModel.self, filter: "uniqueId == '\(uniqueId)'")
  103. }
  104. /// 查询所有未过期视频缓存数据
  105. /// - Returns: description
  106. public func queryVideoObjects() -> Results<PQBaseModel>? {
  107. // "isSelected == false AND date >= \(Int(Date.init().timeIntervalSince1970) - 24 * 60)"
  108. return queryObjects(PQVideoListModel.self, filter: "isSelected == false")
  109. }
  110. /// 删除已缓存视频数据
  111. /// - Returns: <#description#>
  112. public func deleteAllCacheObject() {
  113. guard let deleteObjecs = realmEntry?.objects(PQVideoListModel.self) else {
  114. BFLog(message: "Realm-删除已缓存为空")
  115. return
  116. }
  117. do {
  118. try realmEntry?.write {
  119. realmEntry?.delete(deleteObjecs)
  120. BFLog(message: "Realm-删除已缓存视频成功")
  121. }
  122. } catch let error as NSError {
  123. // handle error
  124. BFLog(message: "Realm-删除已缓存视频失败:\(error)")
  125. }
  126. }
  127. /// 根据条件查询数据
  128. /// - Parameters:
  129. /// - type: 类型
  130. /// - filter: <#filter description#>
  131. /// - Returns: <#description#>
  132. public func queryObjects(_ type: PQBaseModel.Type, filter: String) -> Results<PQBaseModel>? {
  133. let puppies = realmEntry?.objects(type).filter(filter)
  134. BFLog(message: "查询已缓存数据:type = \(type) \(puppies ?? nil)")
  135. return puppies
  136. }
  137. public func deleteObject() {
  138. guard let deleteObjecs = realmEntry?.objects(PQVideoListModel.self).filter("isSelected == true") else { return }
  139. do {
  140. try realmEntry?.write {
  141. realmEntry?.delete(deleteObjecs)
  142. BFLog(message: "Realm-删除已缓存视频成功")
  143. }
  144. } catch let error as NSError {
  145. // handle error
  146. BFLog(message: "Realm-删除已缓存视频失败:\(error)")
  147. }
  148. }
  149. /// 删除
  150. /// - Returns: <#description#>
  151. public func deleteObject(object: PQVideoListModel) {
  152. let videoId: Int = object.videoId
  153. guard let deleteObjecs = realmEntry?.objects(PQVideoListModel.self).filter("videoId == \(videoId)") else { return }
  154. do {
  155. try realmEntry?.write {
  156. realmEntry?.delete(deleteObjecs)
  157. BFLog(message: "Realm-删除已缓存视频成功")
  158. }
  159. } catch let error as NSError {
  160. // handle error
  161. BFLog(message: "Realm-删除已缓存视频失败:\(error)")
  162. }
  163. }
  164. public func deleteObject(_ type: PQBaseModel.Type, filter: String) {
  165. guard let deleteObjecs = queryObjects(type, filter: filter) else { return }
  166. do {
  167. try realmEntry?.write {
  168. realmEntry?.delete(deleteObjecs)
  169. BFLog(message: "Realm-删除已缓存视频成功")
  170. }
  171. } catch let error as NSError {
  172. // handle error
  173. BFLog(message: "Realm-删除已缓存视频失败:\(error)")
  174. }
  175. }
  176. /// 更新缓存视频是否读取过
  177. /// - Parameter object: <#object description#>
  178. /// - Returns: <#description#>
  179. public func updateObject(object: PQVideoListModel) {
  180. guard let newObject = realmEntry?.objects(PQVideoListModel.self).filter("videoId == \(object.videoId)") else { BFLog(message: "更新 newObject 为空")
  181. return
  182. }
  183. BFLog(message: "更新 newObject = \(newObject)")
  184. do {
  185. try realmEntry?.write {
  186. newObject.first?.isSelected = true
  187. BFLog(message: "Realm-更新缓存视频已播放成功:\(newObject)")
  188. }
  189. } catch let error as NSError {
  190. // handle error
  191. BFLog(message: "Realm-更新缓存视频已播放失败:\(error)")
  192. }
  193. }
  194. override private init() {
  195. super.init()
  196. }
  197. override public func copy() -> Any {
  198. return self
  199. }
  200. override public func mutableCopy() -> Any {
  201. return self
  202. }
  203. // MARK: - add by ak 数据库操作 V2 方法
  204. // MARK: add
  205. /// 添加一个
  206. ///
  207. /// - Parameter object: 添加元素
  208. public func realmAdd(realm: Realm, object: Object) {
  209. try! realm.write {
  210. realm.add(object, update: .modified)
  211. }
  212. }
  213. /// 添加多个
  214. ///
  215. /// - Parameter objects: 添加数组
  216. public func realmAdds(realm: Realm, objects: [Object]) {
  217. try! realm.write {
  218. realm.add(objects, update: .modified)
  219. }
  220. }
  221. // MARK: delete
  222. /// 删除一个
  223. ///
  224. /// - Parameter object: 删除元素
  225. public func realmDelete(realm: Realm, object: Object) {
  226. try! realm.write {
  227. realm.delete(object)
  228. }
  229. }
  230. /// 删除多个
  231. ///
  232. /// - Parameter objects: 元素数组
  233. public func realmDeletes(realm: Realm, objects: [Object]) {
  234. try! realm.write {
  235. realm.delete(objects)
  236. }
  237. }
  238. /// 条件删除
  239. ///
  240. /// - Parameters:
  241. /// - object: 元素类型
  242. /// - predicate: 条件
  243. public func realmDeletesWithPredicate(realm: Realm, object: Object.Type, predicate: NSPredicate) {
  244. let results: [Object] = realmQueryWithParameters(realm: realm, object: object, predicate: predicate)
  245. if results.count > 0 {
  246. try! realm.write {
  247. realm.delete(results)
  248. }
  249. }
  250. }
  251. /// 删除该类型所有
  252. ///
  253. /// - Parameter object: 元素类型
  254. public func realmDeleteTypeList(realm: Realm, object: Object.Type) {
  255. let objListResults = realmQueryWithType(realm: realm, object: object)
  256. if objListResults.count > 0 {
  257. try! realm.write {
  258. realm.delete(objListResults)
  259. }
  260. }
  261. }
  262. /// 删除当前数据库所有
  263. public func realmDeleteAll(realm: Realm) {
  264. try! realm.write {
  265. realm.deleteAll()
  266. }
  267. }
  268. // MARK: update
  269. /// 更新元素(元素必须有主键)
  270. ///
  271. /// - Parameter object: 要更新的元素
  272. public func realmUpdte(realm: Realm, object _: Object) {
  273. try! realm.write {
  274. // realm.up(object, update: true)
  275. }
  276. }
  277. /// 更新元素集合(元素必须有主键)
  278. ///
  279. /// - Parameter objects: 元素集合(集合内元素所有属性都要有值)
  280. public func realmUpdtes(realm: Realm, objects _: [Object]) {
  281. try! realm.write {
  282. // realm.add(objects, update: true)
  283. }
  284. }
  285. /// 更新操作 -> 对于realm搜索结果集当中的元素,在action当中直接负值即可修改
  286. ///
  287. /// - Parameter action:操作
  288. public func realmUpdateWithTranstion(realm: Realm, action: (Bool) -> Void) {
  289. try! realm.write {
  290. action(true)
  291. }
  292. }
  293. // MARK: query
  294. /// 查询元素
  295. /// - Parameter type: 元素类型
  296. /// - Parameter filter: 查询条件
  297. public func reamlQueryObjects(realm: Realm, _ type: Object.Type, filter: String) -> Results<Object>? {
  298. let puppies = realm.objects(type).filter(filter)
  299. BFLog(message: "查询已缓存数据:type = \(type) \(puppies)")
  300. return puppies
  301. }
  302. public func reamlQueryObjectsV2(realm: Realm, _ type: Object.Type, filter: String) -> String {
  303. var json: String?
  304. try! realm.write {
  305. let puppies: Results<Object> = realm.objects(type).filter(filter)
  306. BFLog(message: "查询已缓存数据:type = \(type) \(puppies)")
  307. if puppies.count > 0 {
  308. json = (puppies.first as? PQEditProjectModel)!.toJSONString(prettyPrint: false)
  309. }
  310. }
  311. return json ?? ""
  312. }
  313. /// 查询元素
  314. ///
  315. /// - Parameters:
  316. /// - object: 元素类型
  317. /// - Returns: 查询结果
  318. public func realmQueryWith(realm: Realm, object: Object.Type) -> [Object] {
  319. let results = realmQueryWithType(realm: realm, object: object)
  320. var resultsArray = [Object]()
  321. if results.count > 0 {
  322. for i in 0...results.count - 1 {
  323. resultsArray.append(results[i])
  324. }
  325. }
  326. return resultsArray
  327. }
  328. /// 查询元素
  329. ///
  330. /// - Parameters:
  331. /// - object: 元素类型
  332. /// - predicate: 查询条件
  333. /// - Returns: 查询结果
  334. public func realmQueryWithParameters(realm: Realm, object: Object.Type, predicate: NSPredicate) -> [Object] {
  335. let results = realmQueryWith(realm: realm, object: object, predicate: predicate)
  336. var resultsArray = [Object]()
  337. if results.count > 0 {
  338. for i in 0...results.count - 1 {
  339. resultsArray.append(results[i])
  340. }
  341. }
  342. return resultsArray
  343. }
  344. /// 分页查询
  345. ///
  346. /// - Parameters:
  347. /// - object: 查询类型
  348. /// - fromIndex: 起始页
  349. /// - pageSize: 每页多少个
  350. /// - Returns: 查询结果
  351. public func realmQueryWithParametersPage(realm: Realm, object: Object.Type, fromIndex: Int, pageSize: Int) -> [Object] {
  352. let results = realmQueryWithType(realm: realm, object: object)
  353. var resultsArray = [Object]()
  354. if results.count <= pageSize * (fromIndex - 1) || fromIndex <= 0 {
  355. return resultsArray
  356. }
  357. if results.count > 0 {
  358. for i in pageSize * (fromIndex - 1)...fromIndex * pageSize - 1 {
  359. resultsArray.append(results[i])
  360. }
  361. }
  362. return resultsArray
  363. }
  364. /// 条件排序查询
  365. ///
  366. /// - Parameters:
  367. /// - object: 查询类型
  368. /// - predicate: 查询条件
  369. /// - sortedKey: 排序key
  370. /// - isAssending: 是否升序
  371. /// - Returns: 查询结果
  372. public func realmQueryWithParametersAndSorted(realm: Realm, object: Object.Type, predicate: NSPredicate, sortedKey: String, isAssending: Bool) -> [Object] {
  373. let results = realmQueryWithSorted(realm: realm, object: object, predicate: predicate, sortedKey: sortedKey, isAssending: isAssending)
  374. var resultsArray = [Object]()
  375. if results.count > 0 {
  376. for i in 0...results.count - 1 {
  377. resultsArray.append(results[i])
  378. }
  379. }
  380. return resultsArray
  381. }
  382. /// 分页条件排序查询
  383. ///
  384. /// - Parameters:
  385. /// - object: 查询类型
  386. /// - predicate: 查询条件
  387. /// - sortedKey: 排序key
  388. /// - isAssending: 是否升序
  389. /// - fromIndex: 起始页
  390. /// - pageSize: 每页多少个
  391. /// - Returns: 查询结果
  392. public func realmQueryWithParametersAndSortedAndPaged(realm: Realm, object: Object.Type, predicate: NSPredicate, sortedKey: String, isAssending: Bool, fromIndex: Int, pageSize: Int) -> [Object] {
  393. let results = realmQueryWithSorted(realm: realm, object: object, predicate: predicate, sortedKey: sortedKey, isAssending: isAssending)
  394. var resultsArray = [Object]()
  395. if results.count <= pageSize * (fromIndex - 1) || fromIndex <= 0 {
  396. return resultsArray
  397. }
  398. if results.count > 0 {
  399. for i in pageSize * (fromIndex - 1)...fromIndex * pageSize - 1 {
  400. resultsArray.append(results[i])
  401. }
  402. }
  403. return resultsArray
  404. }
  405. // MARK: private method
  406. /// 按类型查询
  407. ///
  408. /// - Parameter object: 查询元素类型
  409. /// - Returns: 查询结果
  410. public func realmQueryWithType(realm: Realm, object: Object.Type) -> Results<Object> {
  411. return realm.objects(object)
  412. }
  413. /// 条件查询
  414. ///
  415. /// - Parameters:
  416. /// - object: 查询元素类型
  417. /// - predicate: 查询条件
  418. /// - Returns: 查询结果
  419. public func realmQueryWith(realm: Realm, object: Object.Type, predicate: NSPredicate) -> Results<Object> {
  420. return realm.objects(object).filter(predicate)
  421. }
  422. /// 条件排序查询
  423. ///
  424. /// - Parameters:
  425. /// - object: 查询类型
  426. /// - predicate: 查询条件
  427. /// - sortedKey: 排序key
  428. /// - isAssending: 是否升序
  429. /// - Returns: 查询结果
  430. public func realmQueryWithSorted(realm: Realm, object: Object.Type, predicate: NSPredicate, sortedKey: String, isAssending: Bool) -> Results<Object> {
  431. return realm.objects(object).filter(predicate)
  432. .sorted(byKeyPath: sortedKey, ascending: isAssending)
  433. }
  434. }