找回密码
 立即注册
首页 资源区 代码 【Swift】GRDB数据库本地存储聊天记录

【Swift】GRDB数据库本地存储聊天记录

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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册