首页 > 解决方案 > 如何使用 swift 检查和更新 mySQL?

问题描述

我有一些代码应该检查是否存在某些 id 并通过在多个表中添加新行来更新数据库。但是我无法让它工作,而且我的代码绝对不是最佳的。

你能帮我让它工作并告诉我正确的方法吗?

这是我用来检查和更新数据库的类:

class UpdatePlanDB{
    
    private var UserPlanCheckIsGood : Bool = false
    private var PlanCheckIsGood : Bool = false
    private var bothChecked : Int = 0
    
    func getNewPlanId(completionHandler: @escaping (Result<Int, Error>) -> Void){
        getLowestPlanId(){ result in
                var lowestPlanId : Int = 2
                switch(result){
                case .success(let res):
                    lowestPlanId = res
                case .failure(let err):
                    completionHandler(.failure(err))
                }
                if(lowestPlanId >= 2){
                    completionHandler(.success(lowestPlanId - 1))
                }else{
                    var highestPlanId : Int = 0
                    self.getHeighestPlanId(){ resultH in
                        switch(resultH){
                        case .success(let res):
                            highestPlanId = res
                        case .failure(let error):
                            completionHandler(.failure(error))
                        }
                        completionHandler(.success(highestPlanId + 1))
                    }
                }
            }
    }
    
    func getLowestPlanId(completionHandler: @escaping (Result<Int, Error>) -> Void){
        let request = NSMutableURLRequest(url: NSURL(string: URL_GET_GET_LOWEST_PLAN_ID)! as URL)
        request.httpMethod = "POST"
        
        //request.httpBody = postString.data(using: String.Encoding.utf8)
        
        let task = URLSession.shared.dataTask(with: request as URLRequest) { data, response, error in
            if error != nil{
                print(error!)
                completionHandler(.failure(NetworkError.badURL))
                return
            }else if let data = data {
                if var jsonString = String(data: data, encoding: .utf8) {
                    jsonString = jsonString.trimmingCharacters(in: CharacterSet(charactersIn: "0123456789.").inverted)
                    completionHandler(.success(Int(jsonString)!))
                }
            }
        }

        task.resume()
    }
    
    func getHeighestPlanId(completionHandler: @escaping (Result<Int, Error>) -> Void){
        let request = NSMutableURLRequest(url: NSURL(string: URL_GET_GET_HIGHEST_PLAN_ID)! as URL)
        request.httpMethod = "POST"
        
        //request.httpBody = postString.data(using: String.Encoding.utf8)
        
        let task = URLSession.shared.dataTask(with: request as URLRequest) { data, response, error in
            if error != nil{
                print(error!)
                completionHandler(.failure(NetworkError.badURL))
                return
            }else if let data = data {
                if var jsonString = String(data: data, encoding: .utf8) {
                    jsonString = jsonString.trimmingCharacters(in: CharacterSet(charactersIn: "0123456789.").inverted)
                    completionHandler(.success(Int(jsonString)!))
                }
            }
        }

        task.resume()
    }
    
    func checkIdDoesNotExist(planId: Int, tableName: String, completionHandler: @escaping (Result<Bool, Error>) -> Void){
        let request = NSMutableURLRequest(url: NSURL(string: URL_CHECK_PLAN_ID_EXISTS)! as URL)
        request.httpMethod = "POST"
        
        let postString = "planId=\(planId)&tableName=\(tableName)"
        
        request.httpBody = postString.data(using: String.Encoding.utf8)
        
        let task = URLSession.shared.dataTask(with: request as URLRequest) { data, response, error in
            if error != nil{
                print(error!)
                completionHandler(.failure(NetworkError.badURL))
                return
            }else if let data = data {
                if let jsonString = String(data: data, encoding: .utf8) {
                    if(jsonString == "0 results"){
                        completionHandler(.success(true))
                       
                    }else{
                        completionHandler(.success(false))
                        
                    }
                }
            }
        }

        task.resume()
    }
    
    func addToUserPlans(planId: Int, completionHandler: @escaping (Result<Bool, Error>) -> Void){
        checkIdDoesNotExist(planId: planId, tableName: "UserPlans"){ result in
            switch(result){
            case .success(let res):
                self.UserPlanCheckIsGood = res
                self.bothChecked += 1
            case .failure(let err):
                print(err)
                self.UserPlanCheckIsGood = false
                self.bothChecked += 1
            }
        }
        
        checkIdDoesNotExist(planId: planId, tableName: "Plans"){ result in
            switch(result){
            case .success(let res):
                self.PlanCheckIsGood = res
                self.bothChecked += 1
            case .failure(let err):
                print(err)
                self.PlanCheckIsGood = false
                self.bothChecked += 1
            }
        }
        
        while(bothChecked != 2){
            print("waiting")
        }
        
        if(PlanCheckIsGood && UserPlanCheckIsGood){
            let request = NSMutableURLRequest(url: NSURL(string: URL_ADD_USER_PLANS)! as URL)
            request.httpMethod = "POST"
            let postString = "userId=\(Auth.auth().currentUser?.uid ?? "None")&planId=\(planId)"
            
            request.httpBody = postString.data(using: String.Encoding.utf8)
            
            let task = URLSession.shared.dataTask(with: request as URLRequest) { data, response, error in
                if error != nil{
                    print(error!)
                    completionHandler(.failure(NetworkError.badURL))
                    return
                }else if let data = data {
                    if let jsonString = String(data: data, encoding: .utf8) {
                        if(jsonString == "true"){
                            completionHandler(.success(true))
                        }else{
                            completionHandler(.success(false))
                        }
                    }
                }
            }

            task.resume()
        }else{
            completionHandler(.failure(NetworkError.badURL))
        }
    }
    
    func addPlan(planId: Int, completionHandler: @escaping (Result<Bool, Error>) -> Void){
        if(PlanCheckIsGood && UserPlanCheckIsGood){
            let request = NSMutableURLRequest(url: NSURL(string: URL_ADD_PLAN)! as URL)
            request.httpMethod = "POST"
            let postString = "userId=\(Auth.auth().currentUser?.uid ?? "None")&planId=\(planId)"
            
            request.httpBody = postString.data(using: String.Encoding.utf8)
            
            let task = URLSession.shared.dataTask(with: request as URLRequest) { data, response, error in
                if error != nil{
                    print(error!)
                    completionHandler(.failure(NetworkError.badURL))
                    return
                }else if let data = data {
                    if let jsonString = String(data: data, encoding: .utf8) {
                        if(jsonString == "true"){
                            completionHandler(.success(true))
                        }else{
                            completionHandler(.success(false))
                        }
                    }
                }
            }

            task.resume()
        }else{
            completionHandler(.failure(NetworkError.badURL))
        }
    }
    
    func addProgressRow(completionHandler: @escaping (Result<Int, Error>) -> Void){
        
    }
}

这就是我所说的:

let newUpdate = UpdatePlanDB()
newUpdate.getNewPlanId(){result in
    switch(result){
    case .success(let res):
        newUpdate.addPlan(planId: res){ result2 in
            switch(result2){
            case .success(let res2):
                print(String(describing: res2))
            case .failure(let err2):
                print(err2)
            }
        }
                                                    
        newUpdate.addToUserPlans(planId: res){ result2 in
            switch(result2){
            case .success(let res2):
                print(String(describing: res2))
            case .failure(let err2):
                print(err2)
            }
        }
    case .failure(let err):
        print(err , "---------------------------")
    }
}

以下函数可以正常工作:getNewPlanId()、getLowestPlanId()、getHeighestPlanId() 和 checkIdDoesNotExist()。

如果代码运行成功,它应该返回“true”两次。随意问任何问题。

标签: mysqlswiftclassswitch-statementcompletionhandler

解决方案


推荐阅读