经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Swift » 查看文章
【Swift】GRDB数据库本地存储聊天记录
来源:cnblogs  作者:Mr丶Landen  时间:2021/5/6 18:00:51  对本文有异议

  

  1. //
  2. // DataManager.swift
  3. // GRDBDemo
  4. //
  5. // Created by Apple on 2021/4/21.
  6. //
  7. import GRDB
  8. struct DataBaseName {
  9. /// 数据库名字
  10. static let test = "conversation.db"
  11. }
  12. /// 数据库表名
  13. struct TableName {
  14. static let message = "ChatMessage"
  15. }
  16. /// 数据库连接
  17. class DBManager: NSObject {
  18. /// 数据库路径
  19. private static var dbPath: String = {
  20. // 获取工程内容数据库名字
  21. let filePath: String = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).first!.appending("/\(DataBaseName.test)")
  22. //print("数据库地址:", filePath as Any)
  23. return filePath
  24. }()
  25. /// 数据库配置
  26. private static var configuration: Configuration = {
  27. // 配置
  28. var configuration = Configuration()
  29. // 设置超时
  30. configuration.busyMode = Database.BusyMode.timeout(5.0)
  31. // 试图访问锁着的数据
  32. //configuration.busyMode = Database.BusyMode.immediateError
  33. return configuration
  34. }()
  35. // MARK: 创建数据 多线程
  36. /// 数据库 用于多线程事务处理
  37. static var dbQueue: DatabaseQueue = {
  38. // 创建数据库
  39. let db = try! DatabaseQueue(path: DBManager.dbPath, configuration: DBManager.configuration)
  40. db.releaseMemory()
  41. // 设备版本
  42. return db
  43. }()
  44. }
  1. //
  2. // ChatMessage.swift
  3. // GRDBDemo
  4. //
  5. // Created by Apple on 2021/4/21.
  6. //
  7. import Foundation
  8. import GRDB
  9. /// 聊天消息类
  10. struct ChatMessage: Codable {
  11. var messageId : String?
  12. var messageType : String?
  13. var messageContent : String?
  14. var senderId : String?
  15. var targetId : String?
  16. private enum Columns: String, CodingKey, ColumnExpression {
  17. case messageId
  18. case messageType
  19. case messageContent
  20. case senderId
  21. case targetId
  22. }
  23. }
  24. extension ChatMessage: MutablePersistableRecord, FetchableRecord {
  25. /// 获取数据库对象
  26. private static let dbQueue: DatabaseQueue = DBManager.dbQueue
  27. //MARK: 创建
  28. /// 创建数据库
  29. private static func createTable() -> Void {
  30. try! self.dbQueue.inDatabase { (db) -> Void in
  31. // 判断是否存在数据库
  32. if try db.tableExists(TableName.message) {
  33. debugPrint("表已经存在")
  34. return
  35. }
  36. // 创建数据库表
  37. try db.create(table: TableName.message, temporary: false, ifNotExists: true, body: { (t) in
  38. t.column(Columns.messageId.rawValue, Database.ColumnType.text)
  39. t.column(Columns.messageType.rawValue, Database.ColumnType.text)
  40. t.column(Columns.messageContent.rawValue, Database.ColumnType.text)
  41. t.column(Columns.senderId.rawValue, Database.ColumnType.text)
  42. t.column(Columns.targetId.rawValue, Database.ColumnType.text)
  43. })
  44. }
  45. }
  46. //MARK: 插入
  47. /// 插入单个数据
  48. static func insert(message: ChatMessage) -> Void {
  49. // 判断是否存在
  50. guard ChatMessage.query(messageId: message.messageId!) == nil else {
  51. debugPrint("插入消息 内容重复")
  52. // 更新
  53. self.update(message: message)
  54. return
  55. }
  56. // 创建表
  57. self.createTable()
  58. // 事务
  59. try! self.dbQueue.inTransaction { (db) -> Database.TransactionCompletion in
  60. do {
  61. var messageTemp = message
  62. // 插入到数据库
  63. try messageTemp.insert(db)
  64. return Database.TransactionCompletion.commit
  65. } catch {
  66. return Database.TransactionCompletion.rollback
  67. }
  68. }
  69. }
  70. //MARK: 查询一条记录
  71. static func query(messageId: String) -> ChatMessage? {
  72. // 创建数据库
  73. self.createTable()
  74. // 返回查询结果
  75. return try! self.dbQueue.unsafeRead({ (db) -> ChatMessage? in
  76. return try ChatMessage.filter(Column(Columns.messageId.rawValue) == messageId).fetchOne(db)
  77. })
  78. }
  79. //MARK:查询与某人聊天的多条记录 - 从第几页开始
  80. static func query(userId:String,page:Int) -> [ChatMessage] {
  81. // 创建数据库
  82. self.createTable()
  83. return try! self.dbQueue.unsafeRead({ (db) -> [ChatMessage] in
  84. return try ChatMessage.fetchAll(db, sql: "Select * from ChatMessage where senderId = '\(userId)' or targetId = '\(userId)' limit \(20 * page),20")
  85. })
  86. }
  87. /// 查询所有
  88. static func queryAll() -> [ChatMessage] {
  89. // 创建数据库
  90. self.createTable()
  91. // 返回查询结果
  92. return try! self.dbQueue.unsafeRead({ (db) -> [ChatMessage] in
  93. return try ChatMessage.fetchAll(db)
  94. })
  95. }
  96. //MARK: 更新
  97. /// 更新
  98. static func update(message: ChatMessage) -> Void {
  99. /// 创建数据库表
  100. self.createTable()
  101. // 事务 更新场景
  102. try! self.dbQueue.inTransaction { (db) -> Database.TransactionCompletion in
  103. do {
  104. // 赋值
  105. try message.update(db)
  106. return Database.TransactionCompletion.commit
  107. } catch {
  108. return Database.TransactionCompletion.rollback
  109. }
  110. }
  111. }
  112. //MARK: 删除
  113. /// 根据messageId删除聊天记录
  114. static func delete(messageId: String) -> Void {
  115. // 查询
  116. guard let message = self.query(messageId: messageId) else {
  117. return
  118. }
  119. // 删除
  120. self.delete(message: message)
  121. }
  122. /// 删除单个聊天信息
  123. static func delete(message: ChatMessage) -> Void {
  124. // 是否有数据库表
  125. self.createTable()
  126. // 事务
  127. try! self.dbQueue.inTransaction { (db) -> Database.TransactionCompletion in
  128. do {
  129. // 删除数据
  130. try message.delete(db)
  131. return Database.TransactionCompletion.commit
  132. } catch {
  133. return Database.TransactionCompletion.rollback
  134. }
  135. }
  136. }
  137. }

   使用示例:

  1. override func viewWillAppear(_ animated: Bool) {
  2. super.viewWillAppear(animated)
  3. let user1 = ChatMessage(messageId: "1010", messageType: "text", messageContent: "12345", senderId: "1", targetId: "2")
  4. ChatMessage.insert(message: user1)
  5. let user2 = ChatMessage(messageId: "1012", messageType: "text", messageContent: "12345", senderId: "123", targetId: "2")
  6. ChatMessage.insert(message: user2)
  7. let user3 = ChatMessage(messageId: "1013", messageType: "text", messageContent: "12345", senderId: "1", targetId: "123")
  8. ChatMessage.insert(message: user3)
  9. let user4 = ChatMessage(messageId: "1014", messageType: "text", messageContent: "12345", senderId: "1", targetId: "2")
  10. ChatMessage.insert(message: user4)
  11. let user5 = ChatMessage(messageId: "1015", messageType: "text", messageContent: "12345", senderId: "1", targetId: "123")
  12. ChatMessage.insert(message: user5)
  13. let user6 = ChatMessage(messageId: "1016", messageType: "text", messageContent: "12345", senderId: "123", targetId: "2")
  14. ChatMessage.insert(message: user6)
  15. let user7 = ChatMessage(messageId: "1017", messageType: "text", messageContent: "12345", senderId: "1", targetId: "2")
  16. ChatMessage.insert(message: user7)
  17. let user8 = ChatMessage(messageId: "1018", messageType: "text", messageContent: "12345", senderId: "1", targetId: "123")
  18. ChatMessage.insert(message: user8)
  19. let message1 = ChatMessage.query(userId: "123", page: 0)
  20. print(message1)
  21. }

 

  

原文链接:http://www.cnblogs.com/xjf125/p/14685284.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号