2012-06-07 5 views
0

У меня есть вопрос :) Я часто встречаю случай, когда у меня есть некоторые объекты (скажем, книги) и список пользователей. У каждого пользователя есть несколько книг. Существует также особый случай текущего пользователя, который имеет больше атрибутов, чем обычный пользователь (права публикации, избранное) и т. Д.Использование данных ядра для хранения пользовательских объектов

Во всех предыдущих проектах я создавал подкласс пользователя под названием CurrentUser и добавляю текущие пользовательские атрибуты/логика (обычный пользователь не может выйти из системы, например). Но я всегда сталкиваюсь с проблемой обеспечения только одного объекта CurrentUser.

Как поживают люди? И правильно ли я это делаю?

ответ

0

Я не уверен, что я понял ваш вопрос, но если вы хотите контролировать, что есть только один экземпляр CurrentUser я создам свой родом одноплодного класса, скажу SessionController, что имеет свойство типа CurrentUser.

Таким образом, вы можете получить доступ к этому свойству в любом месте, и знаете, что он доступен только одному экземпляру этого класса и, следовательно, только одному свойству для вашего текущего пользователя.

CurrentUser* cu = [[SessionController sharedSessionController] currentUser]; 
if(!cu) // allowed 
else // not allowed 

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

О вашем вопросе, я не совсем уверен, почему вы подклассифицировали объект User. Но, возможно, для этого есть некоторые мотивы. Обратите внимание, когда вы занимаетесь подклассами. Под капотом, фактически, если вы используете хранилище sqlite, Core Data сглаживает созданный подкласс. Итак, в вашем случае у вас есть таблица User, у которой есть атрибуты, созданные вами в CurrentUser.

EDIT

Чтение названия вашего вопроса, если управление должно быть сделано с файлом БД, я хотел бы создать объект под названием LoggedUser и избегать использования подкласса.

Здесь Вы можете сохранить идентификатор для своего текущего пользователя и других объектов, которые вы хотите.

Затем, если вы хотите, чтобы проверить, есть ли один пользователь, который уже зарегистрирован, вы можете просто создать запрос, как следующее:

NSInteger count = [fetchRequest countForFetchRequest:&error]; // query against `LoggedUser` 
if(count >= 1) // not allowed 
else // allowed 
+0

Хорошо, я собираюсь с решением поставленных в вашем РЕДАКТИРОВАТЬ. Я также заметил проблему подклассификации. Кто-нибудь знает, эффективнее ли CoreData с плоскими базами данных или с такими базами данных с несколькими выводами? Я знаю, на Android я всегда стремимся к плоской базе данных для скорости ... –

+0

Это зависит. Если вы используете multi-table dbs, вам нужно сделать больше работы по извлечению данных из другой таблицы. Напротив, когда вы используете плоские, вы можете иметь в памяти дополнительные свойства, которые не подходят для вашего приложения. Отметьте как ответ и/или обновите, если хотите. Приветствия. –

+1

Делает смысл. Да, я это отмечаю, я отмечаю это :) –

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