2016-12-21 2 views
2

Так что я создаю это приложение с помощью CoreData.Запрос данных ядра с предикатами

Два объекта, которые у меня есть, являются списками и элементами. У них есть много отношений, то есть список может иметь несколько элементов.

Например: List1 имеет товары: item1, item2

Я написал код для сохранения элементов в конкретном списке, но я имею трудное время на выяснение того, как извлечь и proccess на элементы из конкретный список.

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

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

модель

Мои данные:

Data model

Мои вопросы:

A. Является ли способ, которым я закодированы функции getItemsOnList() правильно? Или есть что-то, что я делаю неправильно.

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

+0

вы можете использовать [MagicalRecord] (https://github.com/magicalpanda/MagicalRecord), чтобы легко справляться с основными задачами данных. после извлечения элементов у вас есть массив ** Items **. вы можете использовать этот массив в качестве источника данных для представления таблицы. кроме этого вы можете [создать Контроллер получаемых результатов] (https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html) для заполнения и обновления таблицы. – Mohammadalijf

ответ

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.id == XXX

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

Я получаю ошибку при разрешении fetchRequest = NSFetchRequest (entityName: EntityTypes.Items.rawValue) – pavlos

+0

ошибка заключается в использовании неразрешенного идентификатора 'EntityTypes' – pavlos

+0

жаль, что это связано с тем, что мой пользовательский класс сущностей ... попробуйте заменить EntityTypes.Items. rawValue с вашим именем объекта, то есть «Элементы» – Jagdeep

0

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

Смежные вопросы