【问题标题】:Core Data fetch entities with only unique attributesCore Data 获取仅具有唯一属性的实体
【发布时间】:2016-05-12 11:00:26
【问题描述】:

我有一个具有以下属性的实体“Person”:

-名称
-姓
-年龄

我创建了许多对象:

(本,   布莱克,   18)
(约翰,史密斯,19)
(伊万,博尔佐夫,18 岁)
(Den,   Balan,     20)
(肯特,布罗曼,20 岁)

如何接收数组或任何其他方式来构建只有唯一年龄 [18,19,20] 的表

请用 Swift 提供答案。

附:当然我可以获取所有对象,并手动搜索唯一的,但我希望有更好的解决方案)

谢谢!

【问题讨论】:

    标签: xcode swift core-data


    【解决方案1】:

    您可以同时使用 NSFetchRequest 的 propertiesToFetchreturnsDistinctResults 属性来获得所有实体的不同年龄结果。

    https://developer.apple.com/library/mac/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSFetchRequest_Class/#//apple_ref/occ/instp/NSFetchRequest/propertiesToFetch

    let fetchRequest = NSFetchRequest(entityName: "Person")
    fetchRequest.resultType = .DictionaryResultType
    fetchRequest.propertiesToFetch = ["age"]
    fetchRequest.returnsDistinctResults = true
    let result = try! managedObjectContext.executeFetchRequest(fetchRequest)
    

    【讨论】:

    • 您能根据我的数据提供一个示例吗?
    【解决方案2】:

    您可以像下面的代码一样检索年龄,在视图加载时调用它,

    var getAllLogObj = [NSManagedObject]()
    var allLogsArray : NSMutableArray = NSMutableArray()
    
    func getAllLogs()
    {
        let appDelegate =
        UIApplication.sharedApplication().delegate as! AppDelegate
    
        let managedContext = appDelegate.managedObjectContext
    
        let fetchRequest = NSFetchRequest(entityName:"Person")
    
        var fetchedResults = [NSManagedObject]()
    
        let _ : NSError! = nil
        do {
            fetchedResults = try managedContext.executeFetchRequest(fetchRequest) as! [NSManagedObject]
            getAllLogObj = fetchedResults
    
        } catch {
            print("Fetching error : \(error)")
        }
    
        if(getAllLogObj.count > 0)
        {
            self.allLogsArray.removeAllObjects()
            self.allLogsArray = NSMutableArray()
    
            for(var i : Int = 0; i < getAllLogObj.count; i++)
            {
                let ageString = getAllLogObj[i].valueForKey("age") as? NSString
                self.allLogsArray.addObject(ageString)
            }
    
        }
        self.tblComplaintList.reloadData()
    }
    

    它在我的最后工作正常。希望这对您也有帮助。

    【讨论】:

      【解决方案3】:

      感谢您的回答,但这正是我所说的“手动搜索”,我让它变得更简单了:

      let fetchRequest = NSFetchRequest(entityName: "Person")
      do {
        let results = try managedContext.executeFetchRequest(fetchRequest)
        persons = results as! [Person]
      } catch let error as NSError {
        print("Could not fetch \(error), \(error.userInfo)")
      }
      
      var temporaryArray = [String]()
      for person in persons {
        if let age = person.age {
          temporaryArray.append(age)
        }
      }
      ages = Array(Set(temporaryArray))
      

      【讨论】:

      • 是的,这一定很简单,因为你需要做..!
      • 分享你定义的变量的所有内容
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多