2012-05-02 18 views
10

Moja aplikacja jest jak wiele aplikacji - ma ekran logowania, gdzie użytkownik wprowadzi nazwę użytkownika i hasło, a przycisk logowania Moja aplikacja używa również danych Core uratować większość obiekty biznesowe użytkownika, które oczywiście są specyficzne dla użytkownika.Jak radzić sobie z bazy danych dla wielu użytkowników

Mam również przycisk Wyloguj, aby umożliwić przełączanie użytkowników. To nie zdarza się często, ale wciąż jest konieczne).

Teraz, jeśli inny użytkownik loguje się, muszę sprowadzić jego szczegółowe dane. Ale jak to zrobić?
Nie chcę usuwać bazy danych użytkownika po jego wylogowaniu, chcę go zapisać, nawet jeśli inni użytkownicy logują się z urządzenia.

Jedyne, co mogę myśleć, to dodać atrybut "ownerId" do każdej jednostki zapisywanej przez Core Data i użyć tego atrybutu jako predykatu podczas pobierania obiektów.
Ale to wydaje się zbyt nieporządne.

Odpowiedz

21

iOS naprawdę nie mają pojęcia o wielu użytkowników, więc „login” będzie ograniczony do aplikacji. Najprostszym rozwiązaniem byłoby użycie innej nazwy pliku dla magazynu trwałego dla każdego użytkownika. Jest on uzyskiwany tylko w jednym miejscu (gdziekolwiek założyłeś swój podstawowy stos danych), więc byłoby to łatwe do wdrożenia.

W standardowym szablonie danych rdzeń, trwałe lokalizacja sklepu znajduje się wewnątrz metody delegata aplikacji persistentStoreCoordinator. Jest to linia:

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

to w zasadzie oznacza, że ​​dane będą przechowywane w pliku bazy danych SQLite w katalogu dokumentów, a plik zostanie wywołana coreDataTemplate.sqlite.

Zakładając, że zanim ten kod jest punkt stracony dokonaniu użytkownikowi zalogowanie się i sprawdził swój identyfikator użytkownika przeciwko jakiejś liście i pochodzić z unikalnym identyfikatorem dla nich. Dalej zakładaj, że identyfikator został zapisany w domyślnych ustawieniach użytkownika.

zmienić linię wyżej:

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

To będzie teraz daje unikalną nazwę pliku dla użytkownika.

Po zmianie użytkowników należy zapisać bieżący kontekst obiektu zarządzanego, a następnie ustawić koordynator magazynu trwałego i kontekst obiektu zarządzanego delegata aplikacji z powrotem na zero. Po ponownym wejściu będzie to pod nowym identyfikatorem użytkownika.

+0

Używam Xcode szablon danych rdzeń tak naprawdę nie wie, gdzie i jak użyć innego pliku, ale to brzmi jak bardzo dobre rozwiązanie. Czy możesz wskazać mi, jak "zresetować" trwały magazyn i wczytać inną nazwę pliku? – Eyal

+0

Zrobimy, ale nie będzie to przez kilka godzin. – jrturton

+0

Wielkie dzięki, będę czekać :) – Eyal

Powiązane problemy