Как работать с многопользовательской базой данных

Мое приложение похоже на множество приложений - у него есть экран входа в систему, где пользователь вводит имя пользователя и пароль, а также кнопку входа в систему. Мое приложение также использует Core Data для сохранения большинства бизнес-объектов пользователя, что, конечно же, конкретный пользователь.

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

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

Единственное, о чем я могу думать, это добавить атрибут "ownerId" для каждого объекта, который я сохраняю через Core Data, и использовать этот атрибут в качестве предиката при извлечении объектов.
Но это кажется слишком грязным.

Ответ 1

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

В стандартном шаблоне данных ядра постоянное хранилище устанавливается внутри метода persistentStoreCoordinator делегата приложения. Это строка:

 NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"coreDataTemplate.sqlite"];

В основном это означает, что данные будут храниться в файле базы данных sqlite в каталоге документов, и файл будет называться coreDataTemplate.sqlite.

Предполагая, что до того, как этот код будет выполнен, вы включили пользователя и проверили свой идентификатор пользователя на какой-то список и придумали для него уникальный идентификатор. Далее предположим, что идентификатор был сохранен в настройках по умолчанию пользователя.

Измените строку выше:

NSString *userIdentifier = [[NSUserDefaults standardUserDefaults] stringForKey:@"loggedOnUserID"];     
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:[NSString stringWithFormat:@"%@_coreDataTemplate.sqlite",userIdentifier]];

Теперь это даст вам уникальное имя файла для вашего пользователя.

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