2012-05-16 4 views
0

У меня есть Article и Category существа, у которых есть много разных отношений. Category имеет name и imagePath (который сохраняет свое имя и путь к изображению значка для этой категории).Как разрешить пользователю изменять тему приложения iphone?

С этой моделью я могу показать статью с названием категории (и изображением категории), которой она принадлежит.

Проблема

Если я хочу, чтобы изменить пользовательские категории изображений (например, изменить тему с новой пачкой значка), что я должен делать?

То, что я сейчас думаю, это создать отдельную сущность, называемую 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

Не могли бы вы объяснить это * с помощью этого подхода. Я должен сохранить выбранную тему в NSUserDefault и искать с помощью categoryId каждый раз, когда мне нужно изображение. *? Я думаю, вы могли бы сделать это только с категорией категории. Объясните лучше свою цель, потому что это не очень понятно для меня. Благодарю. –

+0

Я добавляю больше деталей в отредактированную часть моего сообщения. – sarunw

+0

Где я могу найти * themeId *? Тогда вы могли бы объяснить семантику * Тема *, * Категория * и * Статья *? Спасибо –

ответ

0

Если я понял ваш вопрос, вам нужно, чтобы захватить все ThemeItem объектов, которые относятся к конкретной теме (те выбранных в пользовательских настройках) и до текущего Category. Это правильно?

Если да, то вы на правильном пути. Запрос, который вы выполняете, в порядке.

Теперь, на мой взгляд, у вас могут возникнуть проблемы, если вы удалите Theme и его ThemeItem. В этом случае вы можете иметь Category, который не «связан» с любым ThemeItem. Другими словами, для этого Category у вас нет ThemeItem.

Здесь у вас есть два варианта.

1) Удалить вручную Categorie S, которые не связаны больше с ThemeItem

2) или создать отношения (один-ко-многим, я полагаю) между ThemeItem и Category (вам не нужен categoryId больше). От ThemeItem до Category используйте правило каскада и используйте Nullify для обратного.При удалении ThemeItem удаляется Category. Поскольку правила каскада, если они не управляются должным образом, опасны (они могут удалить весь db), вам нужно проверить, как они себя ведут.

Надеюсь, это поможет.

Редактировать

Если вы хотите, вы можете создать отношения между ThemeItem и Category. Например называть его categories:

Ваша модель может быть как следующее:

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

Отношения categories является один-ко-многим отн к Category с правилом каскада. themeItem является взаимно-однозначным отношением к ThemeItem с правилом nullify.

Когда вы удаляете объект ThemeItem, объект Categorie s также удаляется. Наоборот, когда вы удаляете Category, объект ThemeItem (связанный с этим Category) удаляет определенные дочерние элементы Category.

Таким образом, вы можете избежать сохранения целостности графика в своей модели.

Очевидно, эти новые отношения могут быть применены к вашей модели в этой ситуации:

  • пользователь удалить ThemeItem и вы хотите удалить Category сек, связанные с ним
  • Category принадлежит к определенному ThemeItem; Другими словами, каждый Category содержится в определенном ThemeItem

Я предлагаю вам прочитать о Relationships on Core Data Programming Guide.

Примечание: нет правильного способа создания модели. Основной аспект, который, на мой взгляд, важен, когда дело касается Core Data - это производительность. Когда вы используете Core Data, вы имеете дело с объектами, а не с данными строки. Сказав это, разместите свою модель в соответствии с этим аспектом.

Я надеюсь, что этот anwser позволит вам выбрать подходящую модель для вашей проблемы. Приветствия.

+0

Да, что я хочу делать. При первом запуске у меня будут данные семян для категории и темы, пользователь может добавить и удалить свою собственную категорию, но не может коснуться моих данных семени. Если я выберу второй вариант, как изменить тему? У меня нет способа узнать, какой ThemeItem привязан к какой категории? – sarunw

+0

@art Вы хотите знать, как связать * ThemeItem * с * Category *? –

+0

Со вторым выбором да. С прежним я могу предварительно заполнить приложение с предопределенной темой и сопоставлением между ThemeItem и Category с categoryId, но с новым я не знаю, как это сделать. – sarunw

Смежные вопросы