Ich habe ein Projekt, in dem ich eine Abrufanforderung ausführen muss, die das letzte "aktualisierte" Datum einer Core Data-Entität erhält. Wenn ich tatsächlich die von meiner Abfrage zurückgegebenen Ergebnisse untersuche, sehe ich ein ziemlich merkwürdiges Verhalten. Zusätzlich zu dem "korrekten" Ergebnis, das das Datum enthält, enthalten die Ergebnisse auch ein leeres Wörterbuchelement. Dies geschieht jedes Mal unabhängig davon, wie die zugrunde liegenden Daten aussehen. Noch seltsamer, wenn ich sql bei der Anmeldung von xcode einschalte und die protokollierte Abfrage gegen die sqllite db ausführe, erzeugt es das korrekte Ergebnis ohne zusätzliche Einträge. Ich bin mir nicht ganz sicher, was ich hier falsch mache, jede Hilfe wäre willkommen.Swift-Fetch-Anforderung, die leeres Element in Ergebnissen zurückgibt
Die Funktion, die baut und führt die Abfrage aus:
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];
}
Wenn ich einen Haltepunkt am Ende gesetzt und erzeugt aus den Ergebnissen drucken:
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
Können Sie mit context.executeFetchRequest drucken (Anfrage) ist ohne eine Besetzung? Es ist möglich, dass du etwas umlegst, das nicht wirklich [[String: AnyObject]] ist. Besonders in den Ecken der API, die Objc portiert werden, um Swift gibt es einige seltsame Dinge, die mit Wörterbüchern/Arrays gehen – tbondwilkinson
Ich vermute, Sie sind auf dem richtigen Weg, aber der Druck war nicht besonders aufschlussreich. Hier ist, was ich habe: [{ }, { maxUpdated = "2015-12-30 20:05:31 +0000"; }] – pbuchheit
Dann würde ich einen Haltepunkt in die Fetch-Methode setzen und zurückverfolgen und sehen, wo die Anfrage stammt/wenn das leere Wörterbuch dort – tbondwilkinson