質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Core Data

Core DataはAppleのOS X and iOSのためのオブジェクトモデリングと持続性を持ったフレームワークです。Xcodeはエンティティー、属性そして関係性を特定するためのオブジェクトモデルの編集機能を提供します。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

解決済

CoreDataのNSBatchInsertRequestでリレーションシップを設定したい

yodo
yodo

総合スコア22

Core Data

Core DataはAppleのOS X and iOSのためのオブジェクトモデリングと持続性を持ったフレームワークです。Xcodeはエンティティー、属性そして関係性を特定するためのオブジェクトモデルの編集機能を提供します。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

2回答

0リアクション

0クリップ

202閲覧

投稿2022/08/06 03:12

編集2022/08/06 07:17

複数のBookのデータをサーバーから取得し、userというリレーションシップに同一のUserを設定してCoreDataに保存する、という処理をバッチで行いたいと考えています。

しかし、ループ内でリレーションシップを設定しようとすると、このようなエラーが出てしまいます。

Illegal attempt to establish a relationship 'user' between objects in different contexts (source = <Book: 0x10dfa13a0> (entity: Book; id: 0x11c44fa80 <x-coredata:///Book/t3BB93B8D-448D-4C3E-A915-7F5CB558EA993>; data: { ... }) , destination = <User: 0x10dfc4b80> (entity: User; id: 0x138a5f1d0 <x-coredata:///User/t3BB93B8D-448D-4C3E-A915-7F5CB558EA992>; data: { ... }))

「UserとBookが別のコンテクスト」と書かれれていますが、以下のコードを見てもどこで別のコンテクストになっているのかが分かりません。

そもそもバッチでリレーションシップを設定することは可能でしょうか?

該当のソースコード

swift

func importBooks(user: User) async throws { let books: [BookProperties] = await ... let userObjectID = user.objectID let taskContext = persistentContainer.newBackgroundContext() await taskContext.perform { let user2 = taskContext.object(with: userObjectID) let batchInsertRequest = newBatchInsertRequest(propertyList: [BookProperties], user: user2) if let fetchResult = try? taskContext.execute(batchInsertRequest), let batchInsertResult = fetchResult as? NSBatchInsertResult, let success = batchInsertResult.result as? Bool, success { return } } } private func newBatchInsertRequest(propertyList: [BookProperties], user: User) -> NSBatchInsertRequest { var index = 0 let total = propertyList.count let batchInsertRequest = NSBatchInsertRequest(entity: Book.entity(), managedObjectHandler: { managedObject in guard index < total else { return true } if let book = managedObject as? Book { book.title = propertyList[index].title book.user = user // << Error } index += 1 return false }) return batchInsertRequest }

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Core Data

Core DataはAppleのOS X and iOSのためのオブジェクトモデリングと持続性を持ったフレームワークです。Xcodeはエンティティー、属性そして関係性を特定するためのオブジェクトモデルの編集機能を提供します。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています