我有Article
和Category
个实体,这些实体有很多关系。 Category
有一个name
和一个imagePath
(其名称和路径指向该类别图标的图像)。
通过这个模型,我可以显示它所属的类别名称(和类别图像)的文章。
问题
如果我想让用户更改类别图像(例如使用新的图标包更改主题)我该怎么办?
我现在想的是创建一个名为ThemeItem
的独立实体,保留categoryId
(需要将其添加到类别中)并将imagePath
从Category
移至这个ThemeItem
实体,它将成为
Article <<------------>> Category
- text - categoryId
- name
- categories(Relation) - articles(Relation
和
Theme <-->> ThemeItem
-themeId -categoryId
-themeName -imagePath
-theme(Relation)
通过这种方法,我会让用户通过设置界面选择主题并将themeId
保留在NSUserDefaults
我应该关注这件事还是有更好的办法做这种事情?
检索图片
对于新模型,我只从categoryId
获得Category
,因此我必须在ThemeItem
中查找imagePath
。这是我想到的一些NSPredicate
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"ThemeItem" inManagedObjectContext:moc];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDescription];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"categoryId == %@ AND theme.themeId = %@", category_id_for_article, theme_id_from_user_defaults];
[request setPredicate:predicate];
使用此谓词我得到ThemeItem
及其imagePath
答案 0 :(得分:0)
如果我理解了您的问题,您需要获取属于特定主题的所有ThemeItem
个对象(在用户设置中选择的对象)和当前Category
。是不是?
如果是这样,你就走在了正确的轨道上。您正在执行的查询正常。
现在,在我看来,如果您删除Theme
及其ThemeItem
,则可能会遇到问题。在这种情况下,您可以使Category
与任何ThemeItem
没有“关联”。换句话说,对于Category
,您没有ThemeItem
。
这里有两个选择。
1)手动删除Categorie
不再链接的ThemeItem
2)或者在ThemeItem
和Category
之间建立一种关系(我认为是一对多)(你不再需要categoryId
)。从ThemeItem
到Category
使用级联规则并使用Nullify进行反向。删除ThemeItem
时,Category
也会被删除。
由于级联规则(如果管理不当)很危险(它们可以删除整个数据库),您需要测试它们的行为方式。
希望它有所帮助。
修改强>
如果需要,您可以在ThemeItem
和Category
之间创建关系。例如,将其称为categories
:
您的模型可能如下所示:
ThemeItem Category
- categories (rel) <-->> - themeItem (inverse rel)
关系categories
是具有级联规则的一对多rel Category
。 themeItem
与ThemeItem
具有无效规则的一对一反比关系。
删除ThemeItem
对象时,也会删除Categorie
对象。相反,当您删除Category
时,ThemeItem
对象(与Category
关联的对象)会删除其子项的特定Category
形式。
通过这种方式,您可以避免在模型中保持图形完整性。
显然,在这种情况下,这些新关系可以应用于您的模型:
ThemeItem
,并且您要删除与其关联的Category
Category
属于特定的ThemeItem
;换句话说,每个Category
都包含在特定的ThemeItem
我建议你阅读Relationships on Core Data Programming Guide。
注意:没有正确的方法来创建模型。在我看来,在处理核心数据时,主要方面是性能。使用Core Data时,您处理对象而不处理行数据。说这个,适应你的模型以适应这方面。
我希望这个anwser会让你决定合适的模型以适应你的问题。欢呼声。