如何让用户更改iPhone应用主题?

时间:2012-05-16 09:41:00

标签: ios core-data nspredicate lookup

我有ArticleCategory个实体,这些实体有很多关系。 Category有一个name和一个imagePath(其名称和路径指向该类别图标的图像)。

通过这个模型,我可以显示它所属的类别名称(和类别图像)的文章。

问题

如果我想让用户更改类别图像(例如使用新的图标包更改主题)我该怎么办?

我现在想的是创建一个名为ThemeItem的独立实体,保留categoryId(需要将其添加到类别中)并将imagePathCategory移至这个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

1 个答案:

答案 0 :(得分:0)

如果我理解了您的问题,您需要获取属于特定主题的所有ThemeItem个对象(在用户设置中选择的对象)和当前Category。是不是?

如果是这样,你就走在了正确的轨道上。您正在执行的查询正常。

现在,在我看来,如果您删除Theme及其ThemeItem,则可能会遇到问题。在这种情况下,您可以使Category与任何ThemeItem没有“关联”。换句话说,对于Category,您没有ThemeItem

这里有两个选择。

1)手动删除Categorie不再链接的ThemeItem

2)或者在ThemeItemCategory之间建立一种关系(我认为是一对多)(你不再需要categoryId)。从ThemeItemCategory使用级联规则并使用Nullify进行反向。删除ThemeItem时,Category也会被删除。 由于级联规则(如果管理不当)很危险(它们可以删除整个数据库),您需要测试它们的行为方式。

希望它有所帮助。

修改

如果需要,您可以在ThemeItemCategory之间创建关系。例如,将其称为categories

您的模型可能如下所示:

ThemeItem                   Category
- categories (rel)  <-->>   - themeItem (inverse rel)

关系categories是具有级联规则的一对多rel CategorythemeItemThemeItem具有无效规则的一对一反比关系。

删除ThemeItem对象时,也会删除Categorie对象。相反,当您删除Category时,ThemeItem对象(与Category关联的对象)会删除其子项的特定Category形式。

通过这种方式,您可以避免在模型中保持图形完整性。

显然,在这种情况下,这些新关系可以应用于您的模型:

  • 用户删除ThemeItem,并且您要删除与其关联的Category
  • Category属于特定的ThemeItem;换句话说,每个Category都包含在特定的ThemeItem

我建议你阅读Relationships on Core Data Programming Guide

注意:没有正确的方法来创建模型。在我看来,在处理核心数据时,主要方面是性能。使用Core Data时,您处理对象而不处理行数据。说这个,适应你的模型以适应这方面。

我希望这个anwser会让你决定合适的模型以适应你的问题。欢呼声。