2016-01-05 38 views
8

Mam projekt, w którym muszę wykonać żądanie pobrania, które pobiera najnowszą "zaktualizowaną" datę jednostki danych podstawowych. Kiedy faktycznie badam wyniki zwrócone przez moje zapytanie, widzę raczej dziwne zachowanie. Oprócz "poprawnego" wyniku zawierającego datę, wyniki zawierają również pusty element słownika. Dzieje się tak za każdym razem, niezależnie od tego, jak wyglądają dane podstawowe. Jeszcze dziwniejsze, jeśli włączę logowanie sql w xcode i wykonam zalogowane zapytanie względem sqllite db, to wygeneruje poprawny wynik bez żadnych dodatkowych wpisów. Nie jestem do końca pewien, co robię źle tutaj, każda pomoc byłaby doceniona.Żądanie Swift Fetch Zwracanie pustego elementu w wynikach

Funkcja, która buduje i wykonuje zapytanie:

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]; 
} 

Jeśli mogę umieścić punkt przerwania na końcu i wydrukować wyniki produkuje:

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

Czy można wydrukować za pomocą context.executeFetchRequest (request) bez rzutowania? Możliwe, że rzucasz coś, co w rzeczywistości nie jest [[String: AnyObject]]. Zwłaszcza w rogach API, które są objc przeniesione do Swift, są pewne dziwne rzeczy, które pojawiają się w słownikach/tablicach – tbondwilkinson

+0

Podejrzewam, że jesteś na dobrej drodze, ale druk nie był szczególnie pouczający. Oto co otrzymałem: [{ }, { maxUpdated = "2015-12-30 20:05:31 +0000"; }] – pbuchheit

+0

Następnie umieściłbym punkt przerwania w metodzie pobierania i wyśledziłbym go i zobaczę, skąd pochodzi żądanie/kiedy ten pusty słownik dotrze do niego – tbondwilkinson

Odpowiedz

1

tradycyjny sposób danych Core dostać Maksymalna lub minimalna wartość to zapytanie z limitem pobierania równym 1 i sortowanie na tym kluczu. Jak w tym kod 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 

Byłoby całkiem proste modyfikowanie wyżej dla nieruchomości updated_at.

+0

Tak, można wykonać pobieranie w ten sposób, ale wydajność będzie ucierpiała, ponieważ rozmiar podstawowej tabeli będzie większy. Ponadto widzę to samo zachowanie, jeśli próbuję innych funkcji zagregowanych, takich jak SUM. Po prostu sortowanie i podejmowanie pierwszego wyniku nie pomoże z nimi. – pbuchheit

+0

Każde zapytanie bez indeksu, w tym twoje wymienione powyżej, ma problemy ze skalowaniem, gdy tabela rośnie. Jak duży jest Twój stół? 100, 1000, 10 000, 1M wierszy? Jeśli jest duży, potrzebujesz indeksu - dla obu stylów zapytań. – adonoho