12

私のアプリは多くのアプリのようなものです。ユーザーがユーザー名とパスワードを入力するログイン画面と、ログインボタンがあります。私のアプリはCore Dataを使用して、ユーザーのビジネスオブジェクトのほとんどを保存します。もちろんユーザー固有のものです。 。

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

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

私が考えることができる唯一のことは、Core Dataを介して保存するすべてのエンティティに「ownerId」属性を追加し、オブジェクトをフェッチするときにこの属性を述語として使用することです。
しかし、それはあまりにも厄介に思えます。

4

1 に答える 1

22

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

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

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

これは基本的に、データがドキュメント ディレクトリの sqlite データベース ファイルに格納され、ファイルが .xml という名前になることを意味しますcoreDataTemplate.sqlite

このコードが実行される前に、ユーザーをログオンさせ、ユーザー ID を何らかのリストと照合して、一意の識別子を見つけたと仮定します。さらに、識別子がユーザーのデフォルトに格納されているとします。

上記の行を次のように変更します。

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

これで、ユーザーに一意のファイル名が付けられます。

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

于 2012-05-02T16:02:01.300 に答える