2016-01-05 10 views
8

Possiedo un progetto in cui è necessario eseguire una richiesta di recupero che ottenga la data "aggiornata" più recente di un'entità Core Data. Quando esamino effettivamente i risultati restituiti dalla mia interrogazione, tuttavia, vedo un comportamento piuttosto strano. Oltre al risultato "corretto" contenente la data, i risultati includono anche una voce di dizionario vuota. Succede ogni volta, indipendentemente da come sono i dati sottostanti. Anche estraneo, se accendo SQL loggando xcode ed eseguo la query registrata sul dll sqllite, produce il risultato corretto senza voci aggiuntive. Non sono abbastanza sicuro di cosa sto facendo male qui, ogni aiuto sarebbe apprezzato.Swift Fetch Request Restituzione di articoli vuoti nei risultati

La funzione che costruisce ed esegue la query:

func queryForContactDate(context:NSManagedObjectContext) -> AnyObject? 
{ 

    var expressionDescriptions = [AnyObject](); 

    let expressionDescription = NSExpressionDescription() 

    // Name the column 
    expressionDescription.name = "maxUpdated" 
    // Use an expression to specify what aggregate action we want to take and 
    // on which column. In this case max on the update_at column 
    expressionDescription.expression = NSExpression(format: "@max.updated_at") 
    // Specify the return type we expect 
    expressionDescription.expressionResultType = .DateAttributeType 
    // Append the description to our array 
    expressionDescriptions.append(expressionDescription) 

    // Build out our fetch request the usual way 
    let request = NSFetchRequest(entityName: Contact.entityName()) 

    // Specify we want dictionaries to be returned 
    request.resultType = .DictionaryResultType 

    // Hand off our expression descriptions to the propertiesToFetch field. 
    request.propertiesToFetch = expressionDescriptions 

    // Our result is going to be an array of dictionaries. 
    var results:[[String:AnyObject]]? 

    // Perform the fetch. This is using Swfit 2, so we need a do/try/catch 
    do { 
     results = try context.executeFetchRequest(request) as? [[String:AnyObject]] 
    } catch _ { 
     // If it fails, ensure the array is nil 
     results = nil 
    } 

    return results![0]; 
} 

Se metto un punto di interruzione alla fine e stampare i risultati che produce:

Printing description of results: 
▿ Optional([[:], ["maxUpdated": 2015-12-30 20:05:31 +0000]]) 
    ▿ Some : 2 elements 
    - [0] : 0 elements 
    ▿ [1] : 1 elements 
     ▿ [0] : 2 elements 
     - .0 : "maxUpdated" 
     - .1 : 2015-12-30 20:05:31 +0000 
+0

È possibile stampare con context.executeFetchRequest (richiesta) è senza cast? È possibile che tu stia lanciando qualcosa che in realtà non è [[String: AnyObject]]. Soprattutto negli angoli dell'API che sono stati portati su Swift ci sono alcune cose strane che vanno avanti con i dizionari/array – tbondwilkinson

+0

Sospetto che tu sia sulla strada giusta ma la stampa non è stata particolarmente illuminante. Ecco cosa ho ottenuto: [{ }, { maxUpdated = "2015-12-30 20:05:31 +0000"; }] – pbuchheit

+0

Quindi vorrei inserire un punto di interruzione nel metodo di recupero e tracciarlo indietro e vedere da dove proviene la richiesta/quando quel dizionario vuoto arriva lì – tbondwilkinson

risposta

1

Il tradizionale modo Core Data per ottenere un articolo massimo o minimo è interrogare con un limite di recupero pari a 1 e ordinare su quella chiave. Come in questo codice Objective-C:

+ (NSFetchRequest *) requestForStatusWithMaxID { 

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName: kAMStatusEntity]; 

    NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey: kAMTwID ascending:NO]; 

    request.sortDescriptors = @[sd]; 
    request.fetchLimit = 1; 

    return request; 

} // +requestForStatusWithMaxID 

Sarebbe molto semplice per modificare quanto sopra per la vostra proprietà updated_at.

+0

Sì, è possibile eseguire il recupero in questo modo, ma le prestazioni ne risentiranno con l'aumentare delle dimensioni della tabella sottostante. Inoltre, sto vedendo questo stesso comportamento se provo altre funzioni di aggregazione come SUM. Semplicemente l'ordinamento e il primo risultato non sono d'aiuto. – pbuchheit

+0

Qualsiasi query senza un indice, incluso il tuo elencato sopra, presenta problemi di ridimensionamento man mano che la tabella aumenta. Quanto è grande il tuo tavolo? 100, 1.000, 10.000, 1 milione di righe? Se è grande, allora hai bisogno di un indice - per entrambi gli stili di query. – adonoho

Problemi correlati