Использование основных данных для хранения пользовательских объектов
У меня есть вопрос:) Я часто сталкиваюсь со случаем, когда у меня есть некоторые объекты (говорят книги) и список пользователей. У каждого пользователя есть несколько книг. Существует также особый случай вошедшего в систему пользователя, который имеет больше атрибутов, чем обычный пользователь (права публикации, избранное) и т. Д.
Во всех предыдущих проектах я создавал подкласс User с именем CurrentUser и добавлял туда атрибуты / логику текущего пользователя (обычный пользователь не может выйти, например). Но я всегда сталкиваюсь с проблемой обеспечения существования только одного объекта CurrentUser.
Как другие люди делают это? И правильно ли я это делаю?
1 ответ
Я не совсем уверен, что понял ваш вопрос, но если вы хотите контролировать, что есть только один случай CurrentUser
Я создам своего рода синглтон класс, скажем, SessionController
, который имеет свойство типа CurrentUser
,
Таким образом, вы можете получить доступ к этому свойству в любом месте, и вы знаете, что оно доступно только одному экземпляру этого класса и, следовательно, только одному свойству для вашего текущего пользователя.
CurrentUser* cu = [[SessionController sharedSessionController] currentUser];
if(!cu) // allowed
else // not allowed
Когда вы входите (или что-то еще), вы заполняете это свойство. Когда вы выходите из системы, вы устанавливаете ноль. Если вы хотите войти с другим пользователем, вы можете проверить это свойство. Это простой подход, который может работать в большинстве случаев.
Что касается вашего вопроса, я не совсем уверен, почему вы подкласс User
юридическое лицо. Но, возможно, есть некоторые мотивы для этого. Обратите внимание, когда вы имеете дело с подклассами. В сущности, если вы используете хранилище sqlite, Core Data делает сведенный созданный вами подкласс. Итак, в вашем случае у вас есть только User
таблица с атрибутами, которые вы создали в CurrentUser
,
РЕДАКТИРОВАТЬ
Читая заголовок вашего вопроса, если контроль должен выполняться с помощью файла db, я бы создал сущность с именем LoggedUser
и избегайте использования подкласса.
Здесь вы можете сохранить идентификатор вашего текущего пользователя и другие свойства, которые вы хотите.
Затем, если вы хотите проверить, есть ли один пользователь, который уже вошел в систему, вы можете просто настроить запрос следующим образом:
NSInteger count = [fetchRequest countForFetchRequest:&error]; // query against `LoggedUser`
if(count >= 1) // not allowed
else // allowed