mysql - 如何使用 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”两次。随意问任何问题。
解决方案
推荐阅读
- computer-science - 计算机以 32 位为一组表示信息
- python - 约束 QGraphicsItems 组的成员在一个方向上共享彼此的动作
- sql - 没有子查询的表的多次传递
- python - 神经网络似乎无法学习
- reactjs - React Native 在一个平面列表中呈现标签列表,彼此相邻
- php - 如何在 Visual Studio Code 中的 PHP 函数/类/变量中显示数字引用
- c# - 更改 dateTime 的 get 和 set 属性
- android - 将应用程序重新提交到 google play 商店,但仍然存在被拒绝的警告标志
- android - Kotlin Android - 从 Fragment 中的 AsyncTask 更新 UI
- android-studio - 如何在android studio中配置flutter项目?