【问题标题】:Look through all records for a specific attribute and see the highest value查看特定属性的所有记录并查看最高值
【发布时间】:2017-03-27 10:14:53
【问题描述】:

好的,所以我有一个专为角色扮演而设计的应用程序。我有一个指导用户创建角色的指南。所以用户要做的第一件事就是输入字符编号。所以我希望它搜索我称为characternumber 的属性的所有记录,并查看最大的数字是多少。

示例:假设我有 5 个字符。字符编号为 1,2,3,4,5。我想循环浏览所有记录并看到 5 是最大的数字,而不是自动在字符数文本字段中放置 6。

这是我目前所拥有的:

 @IBOutlet var societyNumberTxt: UITextField!
    @IBOutlet var characterNumberTxt: UITextField!

    let managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    var characters: [NSManagedObject] = []
    var societyNum: [NSManagedObject] = []
    var charNum: [String] = []

    override func viewDidLoad()
    {
        super.viewDidLoad()

        //1
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
            return
        }

        let managedContext = appDelegate.persistentContainer.viewContext

        //2
        let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Characters")

        //3
        do {
            societyNum = try managedContext.fetch(fetchRequest)

            let entityDescription = NSEntityDescription.entity(forEntityName: "Characters", in: managedObjectContext)

            let request: NSFetchRequest<Characters> = Characters.fetchRequest()
            request.entity = entityDescription

            var results = try managedObjectContext.fetch(request as! NSFetchRequest<NSFetchRequestResult>)

            if societyNum.count > 0
            {
                let match = results[0] as! NSManagedObject
                societyNumberTxt.text = (match.value(forKey: "societynumber") as? String)!
                print(match)

                if (match.value(forKey: "characternumber") != nil)
                {
                    self.charNum = match.value(forKey: "characternumber") as! [String]
                    print(self.charNum)
                }
                else
                {
                    print("empty array")
                    characterNumberTxt.text = "1"
                }
            }
            else
            {
                societyNumberTxt.placeholder = "Society # not set"
            }

        } catch let error as NSError {
            print("Could not fetch. \(error), \(error.userInfo)")
        }

    }

我不确定如何循环遍历每条记录并检查数组中的属性和位置。我尝试过这样的事情:

var i = 0

for i in results
{
    var match = results[i] as? NSManagedObject
    charNum[i] = match
}

我得到了错误:
不能使用“Any”类型的索引为“[Any]”类型的值下标

现在来测试我的 if 语句代码:

if (match.value(forKey: "characternumber") != nil)
{
    self.charNum = match.value(forKey: "characternumber") as! [String]
    print(self.charNum)
}

返回错误:
无法将“NSTaggedPointerString”(0x108578d10)类型的值转换为“NSArray”(0x108578dd8)。

我什至是正确的过去吗?

【问题讨论】:

    标签: arrays swift core-data


    【解决方案1】:

    使用SortDescriptor 调整您的获取请求,而不是手动查找最高的characterNumber

    ...
    
    //2
    // get all characters ...
    let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Characters")
    
    // ... sorted by characternumber in acending order
    let sortDescriptor = NSSortDescriptor(key: "characternumber", ascending: true)
    let sortDescriptors = [sortDescriptor]
    fetchRequest.sortDescriptors = sortDescriptors
    
    //3
    do {
        let characters = try managedContext.fetch(fetchRequest) as! [Characters]
        if let  highestCharacterNumber = characters.last?.characternumber {
            characterNumberTxt.text = String(highestCharacterNumber + 1) // assuming characternumber is of type Int
        } else {
            characterNumberTxt.text = "1"
        }
    } ...
    

    【讨论】:

    • 太棒了。这行得通。我确实不得不调整一些代码,因为 characternumber 最初设置为字符串。我还必须添加一个?在 characters.last.characternumber -> characters.last?.characternumber 中最后一个之后运行 else 部分并将 1 放入文本字​​段...这是为什么呢?
    • 你也可以在fetchRequest上使用fetchLimit = 1
    • @JonRose 很有趣。您将如何在这里使用 fetchlimit?
    • 只需添加fetchRequest.fetchLimit = 1
    • @JonRose 为什么我们会得到最后一个元素呢? characternumver最高的那个?
    猜你喜欢
    • 2020-10-21
    • 2018-11-01
    • 1970-01-01
    • 2022-08-18
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多