核心数据 - 如何从实体属性中获取最大值(Swift)

11

食谱

  • recipeID: 整数
  • recipeName: 字符串

我有一个Recipe实体,其中有一个recipeID属性。 如何在Swift中获取最大的recipeID作为Int值?

我是Swift的新手,请帮助我。 提前致谢。

func fetchMaxID() {
    let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
    let fetchRequest = NSFetchRequest(entityName: "Recipe")

    fetchRequest.fetchLimit = 1
    let sortDescriptor = NSSortDescriptor(key: "recipeID", ascending: false)
    fetchRequest.sortDescriptors = [sortDescriptor]
    do {
        let maxID = try [managedObjectContext?.executeFetchRequest(fetchRequest)].first
        print(maxID)
    } catch _ {

    }
}

1
可能是Core Data - 如何获取具有最大值属性的实体的重复问题。 - Abizern
4个回答

13

Apple推荐的并且最快的方法是使用NSExpressions。moc是一个NSManagedObjectContext

private func getLastContactSyncTimestamp() -> Int64? {

    let request: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest()
    request.entity = NSEntityDescription.entity(forEntityName: "Contact", in: self.moc)
    request.resultType = NSFetchRequestResultType.dictionaryResultType

    let keypathExpression = NSExpression(forKeyPath: "timestamp")
    let maxExpression = NSExpression(forFunction: "max:", arguments: [keypathExpression])

    let key = "maxTimestamp"

    let expressionDescription = NSExpressionDescription()
    expressionDescription.name = key
    expressionDescription.expression = maxExpression
    expressionDescription.expressionResultType = .integer64AttributeType

    request.propertiesToFetch = [expressionDescription]

    var maxTimestamp: Int64? = nil

    do {

        if let result = try self.moc.fetch(request) as? [[String: Int64]], let dict = result.first {
           maxTimestamp = dict[key]
        }

    } catch {
        assertionFailure("Failed to fetch max timestamp with error = \(error)")
        return nil
    }

    return maxTimestamp
}

1
这是一个重复回答,与此相同:这里 - wardw
很好,你指出了这一点,但其中一个问题要求提供Swift特定的解决方案,而另一个问题则要求提供Objective-C的解决方案。因此,我不太确定它是否算作重复问题。再次强调,我不确定这里该做出什么样的决定。 - jarora
正确的做法是将问题标记为重复,并指向那里可用的答案。 - Abizern

4

从Ray Wenderlich的Core Data教程中学习

https://www.raywenderlich.com/115695/getting-started-with-core-data-tutorial/

func fetchMaxRecipe() {
    let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
    let fetchRequest = NSFetchRequest(entityName: "Recipe")

    fetchRequest.fetchLimit = 1
    let sortDescriptor = NSSortDescriptor(key: "recipeID", ascending: false)
    fetchRequest.sortDescriptors = [sortDescriptor]
    do {
        let recipes = try context.executeFetchRequest(fetchRequest) as! [Recipe]
        let max = recipes.first
        print(max?.valueForKey("recipeID") as! Int)
    } catch _ {

    }
}

希望这可以帮到你 =)。

@Michael 不用谢。我实际上从你的代码中学到了强制转换获取请求为[Recipe],这导致了更短更干净的代码。谢谢。我刚刚编辑了它。 - Mochi

2
func fetchMaxID() {
    let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
    let fetchRequest = NSFetchRequest(entityName: "Recipe")

    fetchRequest.fetchLimit = 1
    let sortDescriptor = NSSortDescriptor(key: "recipeID", ascending: false)
    fetchRequest.sortDescriptors = [sortDescriptor]
    do {
        let results = try context.executeFetchRequest(fetchRequest) as! [Recipe]
        if (results.count > 0) {
            for result in results {
                print(result.recipeID!)
            }
        } else {
            print("No Recipe")
        }
    } catch let error as NSError {
        // failure
        print("Fetch failed: \(error.localizedDescription)")
    }

}

这也可以工作!



0

要检查实体属性的最大值,您可以简单地使用以下代码:

func findMaxRecipeID() -> Int {
    let maxRecipeID = recipe?.value(forKeyPath: "recipe.@max.recipeID") as! Int
    return maxRecipeID
}

你可以使用 @sum、@max、@min、@count 来实现,这样可以节省很多代码行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接