2017-07-27 37 views
0

我有一個應用程序,它有一個數據庫(和服務器中的數據庫)。當我打開應用程序時,它會調用一個函數,它從服務器獲取信息並將信息存儲在本地數據庫中(我正在使用SQliteSwift),當我打開視圖時,該表爲空,然後關閉/返回重新打開視圖,一切都在那裏。所以我實現了一個刷新按鈕,當我向服務器的數據庫添加一條新記錄,然後調用Refresh函數重新加載數據時,應用程序崩潰,說我存儲信息的數組超出了界限。這可能是因爲我更新了服務器,但不是我的本地數據庫,所以當我執行刷新功能時,它會嘗試再次加載信息。我在想,也許我應該把刷新功能和從viewWillAppear(而不是viewDidLoad,因爲我在那裏)從服務器檢索信息的函數。你們有什麼感想? viewWill在這種情況下需要什麼?viewDidLoad和viewWillAppear。從服務器下載數據和更新表查看

更新

我忘了提,我有一個調用在不同的視圖服務器的功能(這是一個按鈕,單擊它時調用函數,並與的tableView打開視圖)

了的tableView類的代碼如下所示...

//Create arrays where the information will be stored 
var numPoliza = [String]() 
var vigencia = [String]() 
var inicioVigencia = [String]() 
var statusTabla = [String]() 
var nombres = [String]() 
var apellidos = [String]() 
var ids = [String]() 

//Refresher 
var refresh: UIRefreshControl! 

//My viewDidLoad where I call the function that connects to the server 
override func viewDidLoad() { 
    super.viewDidLoad() 
    do{ 
     for consulta in try conn.db!.prepare(tblPoliza){ 
      numPoliza.append(String(consulta[numeroPoliza])) 
      vigencia.append(String(consulta[fechaExpiracion])) 
      inicioVigencia.append(String(consulta[fechaCreacion])) 
      statusTabla.append(String(consulta[status])) 
     } 
    } 
    catch{ 
     //Errors thrown 
    } 

    do{ 
     let query = tblPersona.select(tblPersona[nombre], tblPersona[id], tblPersona[apaterno]) 
      .join(tblPoliza, on: tblPersona[id] == tblPoliza[idCliente]) 
     for datos in try conn.db!.prepare(query){ 
      nombres.append(datos[nombre]!) 
      apellidos.append(datos[apaterno]!) 
      ids.append(String(datos[id])) 
     } 
    } 
    catch{ 
     //Errors thrown 
    } 

    //Refresher that calls the function from below 
    refresh = UIRefreshControl() 
    refresh.attributedTitle = NSAttributedString(string: "Estira para actualizar") 
    refresh.addTarget(self, action: #selector(ConsultaPolizas.getInfoDesdeBD), for: UIControlEvents.valueChanged) 
    tablaView.addSubview(refresh) 

} 


//Refresh function that Calls the Database and appends the information into the arrays 
func getInfoDesdeBD(){ 
    do{ 
     for consulta in try conn.db!.prepare(tblPoliza){ 
      numPoliza.append(String(consulta[numeroPoliza])) 
      vigencia.append(String(consulta[fechaExpiracion])) 
     } 
    } 
    catch{ 
     //Errors thrown 
    } 
    tablaView.reloadData() 
    refresh.endRefreshing() 
} 

而且,調用後者從服務器信息的功能按鈕(其它功能)。

@IBAction func consultaPolizas(_ sender: Any) { 
    //Imprime polizas 
    for usuario in arregloIds { 
    addHospitalMap.addPin.muestraPolizaWeb(numeroID: usuario) 
    } 
    self.performSegue(withIdentifier: "poliza", sender: self) 

} 
+1

請問您可以爲此添加一些代碼嗎?嘗試用斷點調試它,看看發生了什麼。 – Singhal2

+0

你訪問一個數組索引超過它的限制並不重要 - 它總會有一個異常。關鍵是要更新你的數組,以及你正在使用什麼來同時生成索引。 –

+0

@ Singhal2我更新了問題並添加了代碼 –

回答

0

您需要在刷新函數開始時清空數組。例如:

fun refresh() 
{ 
    myArray.removeAll() 
} 
+0

我忘記提及從服務器獲取信息的函數位於另一個視圖中,這可能是我重新加載頁面時出現越界的原因,因爲該函數不會再被調用。我還會將'removeAll()'添加到refresh() –

相關問題