Запрос данных ядра с предикатами
Поэтому я создаю это приложение с использованием 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)