ios - Coredata 在部分中获取和分组对象
<p><p>我正在使用一个非常复杂的对象模型,并且在将我的一些提取分解为多个部分以在表格 View 中显示时遇到了一些麻烦。</p>
<p>我需要将 <code>Meeting</code> 托管对象分组到几个不同的“口袋”中,例如项目、客户和其他一些。出于几个原因,我决定将这些实现为可以与 session 实体关联的标签。 </p>
<p>所以我创建了一个新的 <code>Tag</code> 实体,它有一个类型和一个值,并建立了两者之间的关系:</p>
<pre><code>Meeting <<-->> Tag
</code></pre>
<p>如果我想将 session 与项目相关联,我创建一个名称为“项目”且值为“项目名称”的标签,然后通过关系将其添加到 session 实体。</p>
<p>我最初考虑使用 NSFetchedResultsController,但我遇到了各种各样的问题,所有这些我都不太了解。</p>
<p>例如,这个提取(我省略了不必要的位):</p>
<pre><code>NSFetchRequest *fetch = [ init];
NSEntityDescription *entity = inManagedObjectContext:moc];
NSPredicate *predicate = 'client'"];
NSSortDescriptor *sortDescriptor = [ initWithKey:@"title" ascending:YES];
NSArray *sortDescriptors = ;
;
;
;
NSFetchedResultsController *frc = [ initWithFetchRequest:fetch
managedObjectContext:moc
sectionNameKeyPath:@"self.tags.value"
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 'NSInvalidArgumentException', reason: 'to-many key not allowed here'
</code></pre>
<p>我可能在这里遗漏了一些基本的东西,而且我承认我在谓词方面没有很多经验,但 Apple 关于该主题的文档还有很多不足之处。</p>
<p>作为一个附带问题,我也不明白为什么我必须在 <code>self.tags.value</code> 中将 <code>self</code> 添加到我的 sectionNameKeyPath 中?它有什么作用??在这种情况下,如果我不添加它,我也会抛出异常:</p>
<pre><code>*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '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 = 'client'"];
NSSortDescriptor *sortDescriptor = [ initWithKey:@"title" ascending:YES];
NSArray *sortDescriptors = ;
;
;
;
NSFetchedResultsController *frc = [ initWithFetchRequest:fetch
managedObjectContext:moc
sectionNameKeyPath:@"clientName"
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 'client'
NSString* clientName = @"...";
;
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]