使用谓词

时间:2016-12-21 07:25:47

标签: ios swift core-data nspredicate nsset

所以我正在使用CoreData构建这个应用程序。

我拥有的两个实体是Lists和Items。他们有很多关系,即A List可以有多个项目。

例如:List1有Items:item1,item2

我已经编写了用于在特定列表中存储项目的代码,但是我很难确定如何从特定列表中获取和处理项目。

到目前为止我所做的工作如下

func getItemsOnList(){

        let app = UIApplication.shared.delegate as! AppDelegate
        let context = app.persistentContainer.viewContext

        //fetchRequest to get the List
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "List")
        let predicate = NSPredicate(format: "title == %@", listName)
        fetchRequest.returnsObjectsAsFaults = false
        fetchRequest.predicate = predicate

        if let fetchResults = try? context.fetch(fetchRequest){
            if fetchResults.count > 0 {
                for listEntity in fetchResults {
                    let list = listEntity as! List
                    print(list.title as Any)
                    itemsOnList = list.contains!
                    print(itemsOnList)
                    print("The list with name:\(list.title)has \(itemsOnList.count) items")

                }
            }
        }
    }

此函数返回一个NSSet,假设该NSSet包含该特定List中的所有Items。

我的数据模型是:

Data model

我的问题是:

一个。我编写getItemsOnList()函数的方式是否正确?或者是我做错了什么。

B中。鉴于代码是正确的,并且我获得的NSSet对于所有Items都是正确的,我如何获得该NSSet中的每个Item以便我将它放在TableView上。

2 个答案:

答案 0 :(得分:0)

 func getItemsWithFilter(filterQuery:NSPredicate,sortBy:String?,order:Bool) -> Array<Items> {
var fetchedResults:Array<Items> = Array<Items>()


let fetchRequest = NSFetchRequest(entityName: "Items")
fetchRequest.predicate = filterQuery

if sortBy != nil{
  let sortDescriptor = NSSortDescriptor(key:sortBy! ,
                                        ascending:order )
  let sortDescriptors = [sortDescriptor]
  fetchRequest.sortDescriptors = sortDescriptors
}

//Execute Fetch request you can go with your approach to
do {
  fetchedResults = try self.mainContextInstance.executeFetchRequest(fetchRequest) as! [Items]
} catch let fetchError as NSError {
  print("retrieveById error: \(fetchError.localizedDescription)")
  fetchedResults = Array<Items>()
}catch {
  fetchedResults = Array<Items>()
}

return fetchedResults

}

要调用此方法,您可以将谓词中的List项目传递给查询,说明获取List.id == XXX

中的项目
 let predicate = NSPredicate(format: "ANY list.name in %@", name)
let myResult = self.getItemsWithFilter(predicate,sortBy:nil,order:false)

答案 1 :(得分:0)

回答: A)是的。您正在使用fetch中的对象图。这是Core Data的主要功能。 B)要填充表格视图,您不能使用集合。您需要某种排序的元素列表。也就是阵列。使用-orderedArrayUsingDescriptors:获取已排序的数组。