2017-09-04 5 views
0

Je tente une requête pour obtenir les derniers messages N dans une conversation particulière à partir d'une table de messages. Je pense que c'est le sql correct:sqlite.swift comment faire la sous-requête

select * from 
(select * from messages where convoId = to order by timestamp DESC limit 10) 
order by timestamp ASC; 

J'ai essayé cela en sqlite.swift:

static let table = Table("messages") 
let query = (table.filter(convoId == to).order(timestamp.desc).limit(10)).select(table[*]).order(timestamp.asc) 

qui ne fonctionne pas une fois que la quantité de messages passe devant la limite. Est-il possible de voir ce que sql est produit par la requête sqlite.swift? Aucune suggestion?

EDIT: J'ai également essayé la requête SQL brute mais maintenant je ne sais pas comment extraire le résultat. Je me sens comme cela devrait être un dernier recours:

let toQuoted = "'" + to + "'" 
    let subQueryStr: String = [ 
     "(SELECT * FROM", 
     MessageDataHelper.TABLE_NAME, 
     "WHERE", 
     MessageDataHelper.CONVO_ID, "=", toQuoted, "ORDER BY", MessageDataHelper.TIMESTAMP, "DESC LIMIT", String(5), ")" 
    ].joined(separator: " ") 

    let queryStr: String = [ 
     "SELECT * FROM", 
     subQueryStr, 
     ["ORDER BY", MessageDataHelper.TIMESTAMP, "ASC;"].joined(separator: " ") 
    ].joined(separator: "\n") 

    let stmt = try db.prepare(queryStr) 
    for row in stmt { 
     // ? how can this be used to create model structure 
     for (index, name) in stmt.columnNames.enumerate() { 
      print ("\(name)=\(row[index]!)") 
     } 
    } 

ligne [index] est de type Binding, donc je ne suis pas sûr comment récupérer la valeur là-bas. Aidez-moi, s'il vous plaît!

Merci

Répondre

0

D'accord, donc ressemble sous requête pourrait être trop complexe pour exprimer sqllite.swift. J'ai fini par aller avec la requête SQL brute. Vous pouvez récupérer le résultat par la coulée de la liaison comme indiqué ici:

Getting results from arbitrary SQL statements with correct binding in SQLite.swift

+0

Si jamais vous rêvez d'une bibliothèque Swift SQLite qui fournit la consommation de ligne identique, chaque fois que votre utilisation du générateur SQL ou des requêtes SQL premières, consultez [ GRDB] (http://github.com/groue/GRDB.swift). –