菜鸟教程小白 发表于 2022-12-12 17:06:53

ios - Coredata 在部分中获取和分组对象


                                            <p><p>我正在使用一个非常复杂的对象模型,并且在将我的一些提取分解为多个部分以在表格 View 中显示时遇到了一些麻烦。</p>

<p>我需要将 <code>Meeting</code> 托管对象分组到几个不同的“口袋”中,例如项目、客户和其他一些。出于几个原因,我决定将这些实现为可以与 session 实体关联的标签。 </p>

<p>所以我创建了一个新的 <code>Tag</code> 实体,它有一个类型和一个值,并建立了两者之间的关系:</p>

<pre><code>Meeting &lt;&lt;--&gt;&gt; Tag
</code></pre>

<p>如果我想将 session 与项目相关联,我创建一个名称为“项目”且值为“项目名称”的标签,然后通过关系将其添加到 session 实体。</p>

<p>我最初考虑使用 NSFetchedResultsController,但我遇到了各种各样的问题,所有这些我都不太了解。</p>

<p>例如,这个提取(我省略了不必要的位):</p>

<pre><code>NSFetchRequest *fetch = [ init];
NSEntityDescription *entity = inManagedObjectContext:moc];
NSPredicate *predicate = &#39;client&#39;&#34;];
NSSortDescriptor *sortDescriptor = [ initWithKey:@&#34;title&#34; ascending:YES];
NSArray *sortDescriptors = ;
;
;
;
NSFetchedResultsController *frc = [ initWithFetchRequest:fetch
                                                                      managedObjectContext:moc
                                                                        sectionNameKeyPath:@&#34;self.tags.value&#34;
                                                                                 cacheName:nil];
</code></pre>

<p>在这种特殊情况下,获取确实有效,但不知何故,我得到了意想不到的结果,其中不仅显示了具有值 <code>client</code> 的 <code>Tags</code>,而且还显示了具有值 <code>project 的 <code>Tags</code> </code>???</p>

<p>如果我将谓词更改为 <code>tags.name == 'project'</code> 我会得到一个异常:</p>

<pre><code>*** Terminating app due to uncaught exception &#39;NSInvalidArgumentException&#39;, reason: &#39;to-many key not allowed here&#39;
</code></pre>

<p>我可能在这里遗漏了一些基本的东西,而且我承认我在谓词方面没有很多经验,但 Apple 关于该主题的文档还有很多不足之处。</p>

<p>作为一个附带问题,我也不明白为什么我必须在 <code>self.tags.value</code> 中将 <code>self</code> 添加到我的 sectionNameKeyPath 中?它有什么作用??在这种情况下,如果我不添加它,我也会抛出异常:</p>

<pre><code>*** Terminating app due to uncaught exception &#39;NSInvalidArgumentException&#39;, reason: &#39;Invalid to many relationship in setPropertiesToFetch: (tags.value)
</code></pre>

<p>最后,在这种情况下,使用 fetched results controller 的替代方法是什么?它会是一堆获取请求,我首先获取 <code>Tag</code> 的每个实例,其中 <code>name == 'project'</code> 并遍历数组以提取与其关联的 session 对象吗?这似乎效率很低,但目前我能想到的只有这些,所以如果您有任何其他想法,我很想听听。</p>

<p>非常感谢您抽出宝贵的时间,</p>

<p>罗格</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>问题是 <code>Meeting</code> 有很多 <code>tags</code>,所以你需要使用聚合操作:</p>

<pre><code>NSFetchRequest *fetch = [ init];
NSEntityDescription *entity = inManagedObjectContext:moc];
NSPredicate *predicate = &#39;client&#39;&#34;];
NSSortDescriptor *sortDescriptor = [ initWithKey:@&#34;title&#34; ascending:YES];
NSArray *sortDescriptors = ;
;
;
;
NSFetchedResultsController *frc = [ initWithFetchRequest:fetch
managedObjectContext:moc
sectionNameKeyPath:@&#34;clientName&#34;
cacheName:nil];
</code></pre>

<p>即给我一个所有 <code>Meeting</code> 对象的列表,其中 <code>tags</code> 的 <code>ANY</code> 属于 <code>client</code> 类型,并将它们分组<code>客户名称</code>。要使 <code>clientName</code> 键路径起作用,您需要实现一个临时属性:</p>

<pre><code>- (NSString *)clientName {
    ;

    // Set clientName to the value of the first tag with name &#39;client&#39;
    NSString* clientName = @&#34;...&#34;;

    ;
    return clientName;
}
</code></pre>

<p>如果您的许多 <code>NSManagedObject</code> 子类需要 <code>clientName</code> 属性,您可以在一个通用抽象 <code>NSManagedObject</code> 子类中实现它,并使您的具体子类从那里继承。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - Coredata 在部分中获取和分组对象,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/7071278/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/7071278/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - Coredata 在部分中获取和分组对象