複数の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
1func importBooks(user: User) async throws { 2 let books: [BookProperties] = await ... 3 4 let userObjectID = user.objectID 5 let taskContext = persistentContainer.newBackgroundContext() 6 await taskContext.perform { 7 let user2 = taskContext.object(with: userObjectID) 8 let batchInsertRequest = newBatchInsertRequest(propertyList: [BookProperties], user: user2) 9 if let fetchResult = try? taskContext.execute(batchInsertRequest), 10 let batchInsertResult = fetchResult as? NSBatchInsertResult, 11 let success = batchInsertResult.result as? Bool, success { 12 return 13 } 14 } 15} 16 17private func newBatchInsertRequest(propertyList: [BookProperties], user: User) -> NSBatchInsertRequest { 18 var index = 0 19 let total = propertyList.count 20 21 let batchInsertRequest = NSBatchInsertRequest(entity: Book.entity(), managedObjectHandler: { managedObject in 22 guard index < total else { return true } 23 if let book = managedObject as? Book { 24 book.title = propertyList[index].title 25 book.user = user // << Error 26 } 27 index += 1 28 return false 29 }) 30 return batchInsertRequest 31}

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/08/22 12:06