DatabaseManager.swift 6.45 KB
//
//  DatabaseManager.swift
//  metaCode
//
//  Created by zx on 2024/3/25.
//

import FMDB
import HandyJSON
  
class DatabaseManager {
    private let dbQueue: FMDatabaseQueue
      
    init(filePath: String) {
        let databasePath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
        let filePathStr = "\(databasePath)/CNLiveDownSlideModelDataBase.db"
//        print("2222222:\n\(filePathStr)")
        self.dbQueue = FMDatabaseQueue(path: filePathStr) ?? FMDatabaseQueue()
        // 在这里调用创建表的
        self.createTable()
    }
    
    func hasDataInTable() -> Bool {
        // 查询一行来确定是否有数据
        var isHaveData = false
        dbQueue.inDatabase { db in
            let sql = "SELECT * FROM CNLiveDownSlideModelDataBase LIMIT 1" // 查询一行来确定是否有数据
            let results: FMResultSet? = db.executeQuery(sql, withArgumentsIn: [])
            isHaveData = results != nil && results!.next() // 如果 results 不为空且至少有一行数据,则返回 true
        }
        return isHaveData // 如果 results 不为空且至少有一行数据,则返回 true
    }
    
    // 创建表(如果表不存在)
    func createTable() {
        dbQueue.inDatabase { db in
            if !db.executeUpdate("CREATE TABLE IF NOT EXISTS CNLiveDownSlideModelDataBase (blockId INTEGER PRIMARY KEY AUTOINCREMENT,id INTEGER,timeStamp INTEGER, isGetPage INTEGER,json_data TEXT)", withArgumentsIn: []) {
                print("Error creating table: \(db.lastErrorMessage())")
            }
        }
    }

    // 保存模型(增)
    func saveModel(_ models: [CNLiveDownSlideModel]) {
        self.dbQueue.inTransaction { db, rollback in
            
            do {
                for slide in models {
                    let jsonData = try slide.toJSONString()
                    let insertSQL = "INSERT INTO CNLiveDownSlideModelDataBase (blockId,id,timeStamp,isGetPage, json_data) VALUES (?,?,?,?,?)"
                    if db.executeUpdate(insertSQL, withArgumentsIn: [slide.blockId ,slide.id,slide.timeStamp,0, jsonData ?? ["":""]]) == true{
//                        print("2222222save succ")
                    }else{
//                        print("2222222save fail")
                    }
                }
            } catch {
                rollback
            }
        }
    }
      
    // 更新模型(改)
    func updateModel(_ models: [CNLiveDownSlideModel]) {
        self.dbQueue.inTransaction { db, rollback in
            do {
                for slide in models {
                    let jsonData = try slide.toJSONString()
                    let updateSQL = "UPDATE CNLiveDownSlideModelDataBase SET json_data = ? ,id = ? , isGetPage = ? ,timeStamp = ? WHERE blockId = ?"
                    if db.executeUpdate(updateSQL, withArgumentsIn: [jsonData ?? ["":""],slide.id,0,slide.timeStamp ,slide.blockId]) == true{
//                        print("2222222Succ updating model,blockId\(slide.blockId)")
                    }else{
//                        print("2222222Error updating model")
                    }
                }
            } catch {
                rollback
            }
        }
    }
    
    // 更新表中所有记录的 isGetPage属性
    func updateIsGetPage(isGetPage: Int){
        let updateSQL = "UPDATE CNLiveDownSlideModelDataBase SET isGetPage = ?"
        self.dbQueue.inTransaction { db, rollback in
            if db.executeUpdate(updateSQL, withArgumentsIn: [isGetPage]) == true{
//                print("2222222Succ updating model")
            }else{
//                print("2222222Error updating model")
            }
        }
    }
      
    // 删除模型(删)
    func deleteModel(withID id: Int64) {
        self.dbQueue.inTransaction { db, rollback in
            let statement = "DELETE FROM CNLiveDownSlideModelDataBase WHERE id = ?"
            if db.executeUpdate(statement, withArgumentsIn: [id]){
                print("Success deleting model")
            }else{
                print("2222222Error deleting model")
            }
        }
    }
      
    // 查询所有模型(查)
//    func fetchAllModels() -> [CNLiveDownSlideModel] {
//        var models: [CNLiveDownSlideModel] = []
//        self.dbQueue.inDatabase { db in
//            if let results = try? db.executeQuery("SELECT * FROM CNLiveDownSlideModelDataBase", withArgumentsIn: []){
//                while results.next() {
//                    let model = CNLiveDownSlideModel()
//                    model.pageId = Int(results.int(forColumn: "id"))
//                    let slideModelJSONStr = results.string(forColumn: "downSlideJSONStr")
//                    models.append(model)
//                }
//
//            }
//              
//        }
//        return models
//    }
      
    // 根据ID查询模型(查)
    func fetchModel(withID id: Int64) -> [CNLiveDownSlideModel]? {
        var models: [CNLiveDownSlideModel]?
        self.dbQueue.inDatabase { db in
            let results = try? db.executeQuery("SELECT * FROM CNLiveDownSlideModelDataBase  WHERE id = ? ORDER BY timeStamp ASC", withArgumentsIn: [id])
            var tempModels = [CNLiveDownSlideModel]()
            while results?.next() == true {
                if let jsonData = results!.data(forColumn: "json_data"){
                    if let jsonResult = try? JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] {
//                        print("转换成功,jsonResult: \(jsonResult)")
                        // 在这里,jsonResult就是转换后的Dictionary<String, Any>
                        let res = jsonResult 
                        let slide = newDictionaryToModel(res, CNLiveDownSlideModel.self) as! CNLiveDownSlideModel
                        if let isGetPage = results?.int(forColumn: "isGetPage"){
                            slide.isGetPage = Int(isGetPage)
                        }else{
                            
                        }
                        tempModels.append(slide)
                    } else {
                        print("2222222转换失败,无法转换为字典")
                    }
                   
                }else{
                    print("2222222jsonData fail")
                }
                
            }
            if tempModels.count > 0{
                models = Array(tempModels)
            }
        }
        return models
    }
      
    // 其他数据库操作方法可以在这里继续添加...
}