Core Data 获取仅具有唯一属性的实体

Posted

技术标签:

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

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

-名称 -姓 -年龄

我创建了许多对象:

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

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

请用 Swift 提供答案。

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

谢谢!

【问题讨论】:

【参考方案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))

【讨论】:

是的,这一定很简单,因为你需要做..! 分享你定义的变量的所有内容

以上是关于Core Data 获取仅具有唯一属性的实体的主要内容,如果未能解决你的问题,请参考以下文章

IOS/objective-c/core-data:如何从相关实体获取属性

如何使用 Core Data 中多个实体的属性获取属性值?

如何从Core Data中的字符串获取Processed字符串

在 Core Data 中获取具有关系的实体

iPhone Core Data - 访问具有多种关系的深层属性

如何从 Core Data 中的关系相关实体获取属性?