web-dev-qa-db-ja.com

Today拡張機能でコアデータモデルにアクセスする方法(iOS)

Swift=元のアプリのように今日の拡張機能でCoreDataモデルを使用できますか?はいの場合、NSManagedObjectContextを作成するにはどうすればよいですか?
グループ識別子の横には本当に手がかりがありませんが、残念ながらコンテキストを取得する方法がわかりません。
過去に、CoreDataを使用することを最初にチェックしてアプリを作成してから、AppDelegateを介してmanagedObjectContextを取得しました。 Appleはそれに関する情報を提供しません。

AppDelegateで次の行を編集しました。

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

これに(両方のターゲットにグループを含めた後):

NSURL *storeURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.BenchR.TodayExtensionSharingDefaults"];
storeURL = [storeURL URLByAppendingPathComponent:@"HTWcampus.sqlite"];
NSLog(@"StoreURL2: %@", storeURL);

これで、アプリ内の既存のデータベースはなくなりました(データベースを共有セグメントに入れるのに役立ったと思うので、素晴らしいことです)。

しかし、拡張機能でコンテキストのインスタンスを作成するにはどうすればよいですか? NSManagedObjectサブクラスにアクセスするにはどうすればよいですか?

拡張機能には、これまでにこのコードがあります:

var context: NSManagedObjectContext!

override func viewDidLoad() {
    super.viewDidLoad()

    var storeURL = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.BenchR.TodayExtensionSharingDefaults")
    storeURL = storeURL?.URLByAppendingPathComponent("HTWcampus.sqlite")
    let modelURL = NSBundle.mainBundle().URLForResource("HTWcampus", withExtension: "momd")
    let model = NSManagedObjectModel(contentsOfURL: modelURL)
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: model)
    coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil, error: nil)
    context = NSManagedObjectContext()
    context.persistentStoreCoordinator = coordinator
}

これは正しいですか?はいの場合、NSManagedObject-Subclassesをそこに取得するにはどうすればよいですか?そして、momd-fileをextensionsターゲットに追加する必要がありますか?はいの場合、どうすればそれができますか?

36
Ben

本当に必要なのは、永続ストア(ほとんどの場合SQLiteデータベース)にアクセスすることです。それを実現するには、アプリグループを設定し、ホストアプリが共有コンテナを使用してコアデータスタックを設定するようにする必要があります(したがって、ストアも拡張機能でアクセス可能です)。何かのようなもの:

    NSString *containerPath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:YOUR_SECURITY_APP_GROUP].path;
    NSString *sqlitePath = [NSString stringWithFormat:@"%@/%@", containerPath, @"database.sqlite"];

次に、拡張機能で、共有コンテナ内のデータベースを使用して、管理オブジェクトコンテキストで永続ストアコーディネータを作成します。モデル(.momd)と管理対象オブジェクトのサブクラスを拡張機能のターゲットに含めるようにするだけで、それらを拡張機能と共有できます。

編集:

モデルと管理オブジェクトのサブクラスを追加するには:

1. Make sure you have your app and extension targets

  1. アプリと拡張機能のターゲットがあることを確認してください

    2. Click on your model file, and select both targets under 'Target Membership' on right-hand panel

  2. モデルファイルをクリックし、右側のパネルの[ターゲットメンバーシップ]で両方のターゲットを選択します

    3. Repeat the same with all your managed object subclasses

  3. すべての管理オブジェクトサブクラスで同じことを繰り返します
68
kkodev