菜鸟教程小白 发表于 2022-12-11 18:22:44

ios - 使用谓词查询核心数据


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

<p>我拥有的两个实体是列表和项目。它们有一对多的关系,即一个列表可以有多个项目。</p>

<p>例如:List1 有 Items: item1, item2</p>

<p>我已经编写了将项目存储在特定列表中的代码,但我很难弄清楚如何从特定列表中获取和处理项目。</p>

<p>到目前为止我所做的如下</p>

<pre><code>func getItemsOnList(){

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

      //fetchRequest to get the List
      let fetchRequest = NSFetchRequest&lt;NSFetchRequestResult&gt;(entityName: &#34;List&#34;)
      let predicate = NSPredicate(format: &#34;title == %@&#34;, listName)
      fetchRequest.returnsObjectsAsFaults = false
      fetchRequest.predicate = predicate

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

                }
            }
      }
    }
</code></pre>

<p>此函数返回一个 NSSet,它假定包含该特定列表中的所有项目。</p>

<p>我的数据模型是:</p>

<p> <a href="/image/2cVrL.png" rel="noreferrer noopener nofollow"><img src="/image/2cVrL.png" alt="Data model"/></a> </p>

<p>我的问题是:</p>

<p>A.我编写 getItemsOnList() 函数的方式是否正确?还是我做错了什么。</p>

<p>B.鉴于代码是正确的,并且我得到的 NSSet 对所有项目都是正确的,我将如何获取该 NSSet 中的每个项目以便将其放在 TableView 上。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><pre><code> func getItemsWithFilter(filterQuery:NSPredicate,sortBy:String?,order:Bool) -&gt; Array&lt;Items&gt; {
var fetchedResults:Array&lt;Items&gt; = Array&lt;Items&gt;()


let fetchRequest = NSFetchRequest(entityName: &#34;Items&#34;)
fetchRequest.predicate = filterQuery

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

//Execute Fetch request you can go with your approach to
do {
fetchedResults = try self.mainContextInstance.executeFetchRequest(fetchRequest) as!
} catch let fetchError as NSError {
print(&#34;retrieveById error: \(fetchError.localizedDescription)&#34;)
fetchedResults = Array&lt;Items&gt;()
}catch {
fetchedResults = Array&lt;Items&gt;()
}

return fetchedResults
</code></pre>

<p>}</p>

<p>要调用此方法,您可以将谓词中的列表项作为查询传递给 <strong>fetch Items in which List.id == XXX</strong></p>

<pre><code> let predicate = NSPredicate(format: &#34;ANY list.name in %@&#34;, name)
let myResult = self.getItemsWithFilter(predicate,sortBy:nil,order:false)
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 使用谓词查询核心数据,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/41257278/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/41257278/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 使用谓词查询核心数据