2012-05-02 17 views
10

私のアプリはたくさんのアプリのようなものです。ユーザーにはユーザー名とパスワードを入力するログイン画面があり、ログインボタンでもCore Dataを使用して大部分を保存しますユーザーのビジネスオブジェクトはもちろん、ユーザー固有のものです。複数ユーザデータベースを扱う方法

また、ユーザーの切り替えを有効にするサインアウトボタンもあります。これはあまり起こりませんが、それでも必要です)。

別のユーザーがログインした場合、特定のデータを取得する必要があります。しかし、どうすればいいのですか?
サインアウト時にユーザーのデータベースを削除したくないので、他のユーザーがデバイスからログインしても保存したいと思います。

私が考えることができるのは、コアデータを介して保存するすべてのエンティティに「ownerId」属性を追加し、オブジェクトをフェッチするときにこの属性を述語として使用することだけです。
しかし、あまりにも面倒です。

答えて

21

iOSには実際に複数のユーザーの概念がないため、「ログイン」の範囲がアプリに限定されます。最も簡単な解決策は、各ユーザーの永続ストアに異なるファイル名を使用することです。これは、(コアデータスタックを設定している)どこにでも派生するため、実装するのはかなり簡単です。

標準のコアデータテンプレートでは、永続ストアの場所は、アプリケーションデリゲートのpersistentStoreCoordinatorメソッド内で設定されます。これは、この行です:

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

これは基本的にデータはドキュメントディレクトリ内のsqliteデータベースファイルに保存され、ファイルがcoreDataTemplate.sqliteと呼ばれることを意味します。

このコードが実行される前に、ユーザーログオンを行い、ユーザーIDをいくつかのリストと照合して、それらに固有のIDを提示したとします。さらに、識別子がユーザのデフォルト値に格納されていると仮定します。

変更上記の行に:

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

これが今、あなたのユーザーのためのユニークなファイル名を与えます。

ユーザを変更する場合は、現在の管理オブジェクトコンテキストを保存してから、アプリケーションデリゲートの永続ストアコーディネータと管理オブジェクトコンテキストをnilに戻す必要があります。再アクセスされると、新しいユーザーIDの下に置かれます。

+0

私はxCodeコアデータテンプレートを使用していますので、どこでどのように別のファイル名を使用するのか分かりませんが、非常に良い解決策のように聞こえます。永続的なストアをリセットし、別のファイル名でロードする方法を教えてください。 – Eyal

+0

しますが、数時間かかることはありません。 – jrturton

+0

ありがとう、私はお待ちしております:) – Eyal

関連する問題