2016-12-21 3 views
2

したがって、CoreDataを使用してこのアプリケーションを構築しています。述語でコアデータを照会する

私が持っている2つのエンティティは、リストとアイテムです。それらは多くの関係を有する、すなわち、リストは複数のアイテムを有することができる。例えば

:List1をはアイテムを持っている:ITEM1、

ITEM2私は特定のリスト内の項目を保存するが、私はからアイテムを取得し、proccessする方法を考え出すに困難な時間を過ごしていますためのコードを書かれています特定のリスト。この関数は、その特定のリスト内のすべての項目が含まれていると仮定されNSSetを返し

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") 

       } 
      } 
     } 
    } 

を次のように私がこれまで行ってきた何

です。

マイデータモデルは次のとおりです。

Data model

私の質問は以下のとおりです。

A.私は正しいgetItemsOnList()関数をコード化された方法ですか?それとも私が間違っていることがありますか?

B.コードが正しいことと、取得するNSSetがすべてのアイテムで正しいとすれば、NSViewの各アイテムをどのように取得してTableViewに置くことができますか?

+0

[MagicalRecord](https://github.com/magicalpanda/MagicalRecord)を使用すると、簡単にコアデータタスクを処理できます。アイテムを取得した後、**アイテム**の配列があります。この配列をテーブルビューのデータソースとして使用できます。それ以外の場合は、[Fetched Results Controllerを作成する](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html)を使用して、go tableviewを読み込んで更新することができます。 – 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の代わりにEntityTypeのクラスを使用しています。あなたのエンティティ名、つまり "Items"を持つrawValue – Jagdeep

0

回答: A)はい。フェッチからのオブジェクトのグラフを使用しています。これがコアデータの主な機能です。 B)テーブルビューを塗りつぶすには、セットを使用できません。何らかの種類のソートされた要素リストが必要です。つまり、配列です。 -orderedArrayUsingDescriptors:ソートされた配列を取得する。

関連する問題