Запрос данных ядра с предикатами

Поэтому я создаю это приложение с использованием CoreData.

У меня есть две сущности: списки и предметы. Они имеют отношение ко многим, т.е. список может иметь несколько элементов.

Например: список1 имеет элементы: элемент1, элемент2

Я написал код для хранения Предметов в определенном списке, но мне трудно разобраться, как извлечь и обработать Предметы из определенного Списка.

То, что я сделал до сих пор, заключается в следующем

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, который должен содержать все элементы в этом конкретном списке.

Моя модель данных:

Модель данных

Мои вопросы:

A. Правильно ли я кодировал функцию getItemsOnList()? Или я что-то не так делаю?

Б. Учитывая, что код верен, а полученный NSSet верен со всеми Элементами, как я получу каждый Элемент в этом NSSet, чтобы я мог поместить его в TableView.

2 ответа

Ответы: а) да. Вы используете график объектов из выборки. Это основная функциональность Core Data. Б) Для заполнения табличного представления вы не можете использовать набор. Вам нужен какой-то отсортированный список элементов. То есть массив. Используйте -orderedArrayUsingDescriptors: для получения отсортированного массива.

 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)
Другие вопросы по тегам