【问题标题】:Coredata NSFetchedResultsController predicate on One-To-Many relationship (outside in)Coredata NSFetchedResultsController 关于一对多关系的谓词(由外而内)
【发布时间】:2018-01-26 09:02:14
【问题描述】:

我的 coredata xcdatamodel 中有以下设置:

网站中基本上有一组文章(TMArticle),将分为部分(TMSection)和期刊(TMJournal)。应用导航必须首先显示所有部分,然后导航以仅显示属于所选部分的所有文章中包含的期刊列表。我不太确定在没有反向关系的情况下如何实现这一点。理想情况下,在这种设置中不需要反向关系(从章节和期刊回到文章),但我怎样才能编写一个完全符合我要求的谓词?

我使用以下 FRC 获取所有文章的列表:

@synthesize articlesFRC = articlesFRC_;
-(NSFetchedResultsController*)articlesFRC {
    if (nil==articlesFRC_) {
        NSFetchRequest *articlesFR = [NSFetchRequest fetchRequestWithEntityName:[TMArticle entityName]];
        NSSortDescriptor *articleSD = [NSSortDescriptor sortDescriptorWithKey:@"nid"
                                                                    ascending:NO];
        [articlesFR setSortDescriptors:[NSArray arrayWithObject:articleSD]];
        articlesFRC_ = [[NSFetchedResultsController alloc] initWithFetchRequest:articlesFR
                                                           managedObjectContext:[[[RKObjectManager sharedManager] objectStore] managedObjectContextForCurrentThread]
                                                             sectionNameKeyPath:nil
                                                                      cacheName:nil];
        [articlesFRC_ setDelegate:self];
        [articlesFRC_ performFetch:NULL];
    }
    return articlesFRC_;
}

但是,我被困在创建 FRC 以仅获取那些属于用户已经为其选择了一个部分的文章的期刊,我的 FRC 的占位符谓词:

@synthesize journalsFRC = journalsFRC_;
-(NSFetchedResultsController*)journalsFRC {
    if (nil==journalsFRC_ && nil!=self.selectedSectionManagedObjectID) {
        NSFetchRequest *journalFR = [NSFetchRequest fetchRequestWithEntityName:[TMJournal entityName]];
        NSSortDescriptor *journalSD = [NSSortDescriptor sortDescriptorWithKey:@"weight"
                                                                    ascending:YES];
        [journalFR setSortDescriptors:[NSArray arrayWithObject:journalSD]];
        [journalFR setPredicate:<#(NSPredicate * _Nullable)#>];
        journalsFRC_ = [[NSFetchedResultsController alloc] initWithFetchRequest:journalFR
                                                           managedObjectContext:[[[RKObjectManager sharedManager] objectStore] managedObjectContextForCurrentThread]
                                                             sectionNameKeyPath:nil
                                                                      cacheName:nil];
        [journalsFRC_ setDelegate:self];
        [journalsFRC_ performFetch:NULL];
    }
    return journalsFRC_;
}

我还想确保通过 web 服务调用对部分选择的任何更改或文章列表的更新都应该自动更新满足条件的期刊列表,我不太确定如何适应与上述谓词相同。

其他信息:

之前忘了提,taxonomyID 是 Sections (TMSection) 和 Journals (TMJournal) 的主键,而 nid 是文章 (TMArticle) 的主键.

每个 Web 服务响应示例:

文章列表:

[
    {
        "nid": "3",
        "listing_post_date": "Tuesday, August 15, 2017 - 19:49",
        "listing_updated_date": "Tuesday, August 15, 2017 - 19:49",
        "title": "ACL Tear",
        "field_journal": [
            {
                "tid": "6"
            },
            {
                "tid": "7"
            }
        ],
        "field_section": [
            {
                "tid": "2"
            },
            {
                "tid": "8"
            }
        ]
    },
    {
        "nid": "1",
        "listing_post_date": "Saturday, March 25, 2017 - 14:23",
        "listing_updated_date": "Sunday, April 9, 2017 - 10:51",
        "title": "Reverse Total Shoulder arthroplasty",
        "field_journal": [
            {
                "tid": "3"
            },
            {
                "tid": "4"
            }
        ],
        "field_section": [
            {
                "tid": "2"
            },
            {
                "tid": "5"
            }
        ]
    }
]

部分列表:

[
    {
        "name": "Sports",
        "field_section_image": [],
        "tid": "2",
        "weight": "0",
        "field_section_color": {
            "rgb": "#bbf1f3"
        }
    },
    {
        "name": "Hand",
        "field_section_image": [],
        "tid": "5",
        "weight": "1",
        "field_section_color": {
            "rgb": "#96c394"
        }
    },
    {
        "name": "Knee",
        "field_section_image": [],
        "tid": "8",
        "weight": "2",
        "field_section_color": {
            "rgb": "#f29d9d"
        }
    }
]

期刊列表:

[
    {
        "name": "Bone &amp; Joint Research",
        "tid": "3",
        "weight": "0"
    },
    {
        "name": "Sports Journal",
        "tid": "7",
        "weight": "0"
    },
    {
        "name": "Sports Medicine",
        "tid": "4",
        "weight": "0"
    },
    {
        "name": "The Knee Journal",
        "tid": "6",
        "weight": "0"
    }
]

【问题讨论】:

    标签: ios cocoa-touch core-data nspredicate nsfetchedresultscontroller


    【解决方案1】:

    你应该几乎总是为每一个关系指定逆;在极少数情况下,没有你会过得更好。

    查看您的数据,似乎给定部分可以与许多文章相关,因此添加从TMSection 到TMArticle 的一对多关系。

    数据只有与一篇文章相关的期刊;如果这普遍适用,那么您可以添加从 TMJournal 到 TMArticle 的一对一关系。

    然后使用以下谓词获取TMJournals:

    [journalFR setPredicate:[NSPredicate predicateWithFormat:@"ANY article.sections == %@", self.selectedSectionManagedObjectID];
    

    遗憾的是,FRC 只会观察到 Journal 对象的更改,因此您需要专门处理文章或选择 Section 的更改。

    【讨论】:

    • 感谢您的输入,但是,期刊也可以与文章建立一对多的关系,在我的例子中,数据是样本数据。那么,如果我在 Article-Section 和 Article-Journal 之间建立多对多关系,谓词将如何变化?另外,我对 Drupal 的了解有限,所以我无法在服务器中维护多对多的关系映射。有了这些数据,有没有办法在coredata中自动建立多对多关系?
    • 我刚刚按照您的建议将 xcdatamodel 的关系更改为适当的反向关系,结果发现一旦将期刊添加到文章中,反向关系就会由 coredata 自动管理和维护,与节也。谢谢指导!如果期刊和文章之间存在多对多关系,我只需要弄清楚谓词。
    • 我认为您将需要使用嵌套子查询 - 不记得确切的语法,而不是通过我的 Mac 来检查。试试"SUBQUERY(articles,$A,SUBQUERY($A.sections,$S,$S == %@).@count &gt; 0).@count &gt; 0", selectedSectionManagedObjectID。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多