2017-07-06 3 views
0

J'ai intégré le framework SQLite.swift dans un de mes projets swift et tout fonctionnait bien jusqu'à ce que j'ajoute la requête ci-dessous. Après avoir ajouté le projet de requête ci-dessous prend trop de temps à construire. J'ai attendu 30 minutes mais le projet n'est toujours pas respecté.Le projet prend trop de temps à construire et à exécuter après l'ajout d'une requête complexe

do 
{ 
let stmt = try DB!.prepare ("SELECT e." + ENDPOINT_ID + " as _id, lk." + HUB_ID + ", e." + X_ENDPOINT_ID + ", e." + ENDPOINT_DESC + ", e." + ENDPOINT_TYPE_ID +", et." + ENDPOINT_STATUS_MIN + ", et." + ENDPOINT_STATUS_MAX + ", e." + ENDPOINT_STATUS + " FROM " + TABLE_ENDPOINT + " as e INNER JOIN " + TABLE_ENDPOINT_TYPE + " as et " + 
" ON e." + ENDPOINT_TYPE_ID + " = et." + ENDPOINT_TYPE_ID + 
" INNER JOIN " + TABLE_LINKING + " as lk " + 
" ON e." + ENDPOINT_ID + " = lk." + ENDPOINT_ID + 
" INNER JOIN " + TABLE_NODE + " as n " + 
" ON lk." + NODE_ID + " = n." + NODE_ID + 
" INNER JOIN " + TABLE_NODE_TYPE + " as nt " + 
" ON n." + NODE_TYPE_ID + " = nt." + NODE_TYPE_ID + 
" WHERE lk." + SECTION_ID + "=" + section_Id + 
" AND nt." + NODE_CATEGORY + " = "S" " + 
" ORDER BY e." + ENDPOINT_ID + " ASC") 

     let arr = Array(try stmt.run) 

     print("\(arr)") 
     return arr 
    } catch { 
     print("failed: \(error)") 
     return [] 
    } 

Si je commente le code ci-dessus et essayer de lancer le projet, il prend à peine une minute pour exécuter le projet, mais après avoir ajouté ce code, il prend beaucoup de l'enfer du temps. J'ai attendu près de 30 minutes, mais le projet n'est toujours pas compilé, ni aucune erreur. Merci d'avance pour l'aide

Répondre

0
let query = (TABLE_ENDPOINT.select(TABLE_ENDPOINT[ENDPOINT_ID], TABLE_LINKING[HUB_ID], TABLE_ENDPOINT[ETCT_ENDPOINT_ID], TABLE_ENDPOINT[ENDPOINT_DESC], TABLE_ENDPOINT[ENDPOINT_TYPE_ID], TABLE_ENDPOINT_TYPE[ENDPOINT_STATUS_MIN], TABLE_ENDPOINT_TYPE[ENDPOINT_STATUS_MAX], TABLE_ENDPOINT[ENDPOINT_STATUS]).join(TABLE_ENDPOINT_TYPE, on: TABLE_ENDPOINT[ENDPOINT_TYPE_ID] == TABLE_ENDPOINT_TYPE[ENDPOINT_TYPE_ID]).join(TABLE_LINKING, on: TABLE_ENDPOINT[ENDPOINT_ID] == TABLE_LINKING[ENDPOINT_ID]).join(TABLE_NODE, on: TABLE_LINKING[NODE_ID] == TABLE_NODE[NODE_ID]).join(TABLE_NODE_TYPE, on: TABLE_NODE[NODE_TYPE_ID] == TABLE_NODE_TYPE[NODE_TYPE_ID]) 
       .filter(TABLE_LINKING[SECTION_ID] == section_Id && TABLE_NODE_TYPE[NODE_CATEGORY] == "S") 
       .order(TABLE_ENDPOINT[ENDPOINT_ID].asc)) 

      let arr = Array(try DB!.prepare(query)) 
0

Le compilateur Swift a des difficultés à traiter les littéraux de grande chaîne. Voir aussi this question pour d'autres conseils.

Je recommande de diviser le sql et de construire une variable de chaîne en petites étapes:

var sql = "SELECT e." + ENDPOINT_ID 
sql = sql + HUB_ID + ", e." 
sql = sql + X_ENDPOINT_ID + ", e." 
... 
let stmt = try DB!.prepare(sql) 
+0

Pourquoi utiliser une concaténation de chaîne? Utilisez une seule chaîne et une interpolation de chaîne ou utilisez un format de chaîne. – rmaddy

+0

Bien sûr, il existe toujours plusieurs façons de résoudre un problème. C'est l'un d'eux. Construire une seule chaîne avec plus de 20 variables pour l'interpoler est à mon humble avis pas un bon choix d'un aspect de la maintabilité. – zisoft