Jay
(Jason Wooten)
November 8, 2020, 2:28pm
1
I am not able to update an existing object (as an in memory object) that contains an embedded object. Maybe in-memory copies are not compatible with embedded objects or I’m overlooking something.
Using the classes from the documentation here , I have an existing business with a List of embedded addresses. When making an in memory copy of the business, changing the name property and then attempting to save it, Realm throws an error:
Cannot add an existing managed embedded object to a List.
Which is not at all what’s being done. Here’s the code
let b = realm.objects(Business.self).first!
//make an unmanaged copy of a business
let someBusiness = Business(value: b)
someBusiness.name = "New Business Name"
try! realm.write {
realm.add(someBusiness, update: .modified)
}
If I remove the embedded List property from the Business class, it works correctly.
macOS 10.15
Realm 10.1.1
XCode 12
No sync - local only
Hi @Jay ,
In your code you’re trying to add a new Business in the realm.
Instead you could try this snippet:
// You have the object already so you don't need a copy
let b = realm.objects(Business.self).first!
try! realm.write {
b.name = "New Business Name"
}
Please let me know if it helps.
Jay
(Jason Wooten)
November 9, 2020, 4:00pm
3
Thanks for the reply @Pavel_Yakimenko
We’re not trying to add a new business, we are modifying the embedded object that is part of an existing business (it’s already saved and managed by Realm)
For our use case, we need a copy. It’s a macOS app with a sheet that pulls down to allow editing of the object and we need an in-memory copy so we can change it around before the user saves it. e.g. the user can click cancel on the sheet and the object is deallocated and no changes are saved.
In this case I’d recommend to create a copy of EmbeddedObject too.
Business(value: b) creates a shallow copy so you need to copy Address models.
let someBusiness = Business(value: b)
let addr = Address(value: b.addresses.first!)
someBusiness.name = "New Business Name"
someBusiness.addresses.replace(index: 0, object: addr)
try! realm.write {
realm.add(someBusiness, update: .modified)
}
@Jay , as soon as your original code is correct, there is the ticket created to fix this issue.
opened 05:49PM - 09 Nov 20 UTC
Crash during upsert of an existing object with a list of EmbeddedObject inside.
…
## Goals / Expected Results
I can upsert a record.
## Actual Results
Exception: ** Terminating app due to uncaught exception 'RLMException', reason: 'Cannot add an existing managed embedded object to a List.'**
## Steps for others to Reproduce
Create unmanaged copy of existing object with the property - list of EmbeddedObject's children objects.
Try to add it with `UpdatePolicy.update`
## Workaround
Create a deep copy of a target object.
## Code Sample
```
class Address: EmbeddedObject {
@objc dynamic var street: String? = nil
@objc dynamic var city: String? = nil
@objc dynamic var country: String? = nil
@objc dynamic var postalCode: String? = nil
}
// Define an object with an array of embedded objects
class Business: Object {
@objc dynamic var _id = ObjectId.generate()
@objc dynamic var name = ""
let addresses = List<Address>() // Embed an array of objects
override static func primaryKey() -> String? {
return "_id"
}
convenience init(name: String, addresses: [Address]) {
self.init()
self.name = name
self.addresses.append(objectsIn: addresses)
}
}
let b = realm.objects(Business.self).first!
//make an unmanaged copy of a business
let someBusiness = Business(value: b)
someBusiness.name = "New Business Name"
try! realm.write {
realm.add(someBusiness, update: .modified)
}
```
## Stack trace
```
*** First throw call stack:
(
0 CoreFoundation 0x00007fff2043a126 __exceptionPreprocess + 242
1 libobjc.A.dylib 0x00007fff20177f78 objc_exception_throw + 48
2 delcrash 0x00000001036918c5 _ZN18RLMAccessorContext12createObjectEP11objc_objectN5realm12CreatePolicyEbNS2_6ObjKeyE + 3125
3 delcrash 0x00000001036ea20d RLMAddObjectToRealm + 285
4 delcrash 0x00000001038876c4 $s10RealmSwift0A0V3add_6updateySo0aB6ObjectC_AC12UpdatePolicyOtF + 1252
5 delcrash 0x00000001034fc24b $s8delcrash14ViewControllerC9addActionyyFyyXEfU_ + 251
6 delcrash 0x00000001034fb84f $ss5Error_pIgzo_ytsAA_pIegrzo_TR + 15
7 delcrash 0x00000001034fc2a4 $ss5Error_pIgzo_ytsAA_pIegrzo_TRTA.1 + 20
8 delcrash 0x00000001038866cb $s10RealmSwift0A0V5write16withoutNotifying_xSaySo20RLMNotificationTokenCG_xyKXEtKlF + 299
9 delcrash 0x00000001034fbfb8 $s8delcrash14ViewControllerC9addActionyyF + 1112
10 delcrash 0x00000001034fbace $s8delcrash14ViewControllerC6runAddyyF + 46
11 delcrash 0x00000001034fb0d3 $s8delcrash14ViewControllerC11viewDidLoadyyF + 723
12 delcrash 0x00000001034fba8b $s8delcrash14ViewControllerC11viewDidLoadyyFTo + 43
13 UIKitCore 0x00007fff23f37de3 -[UIViewController _sendViewDidLoadWithAppearanceProxyObjectTaggingEnabled] + 88
14 UIKitCore 0x00007fff23f3c6ca -[UIViewController loadViewIfRequired] + 1084
15 UIKitCore 0x00007fff23f3cab4 -[UIViewController view] + 27
16 UIKitCore 0x00007fff246ac28b -[UIWindow addRootViewControllerViewIfPossible] + 313
17 UIKitCore 0x00007fff246ab978 -[UIWindow _updateLayerOrderingAndSetLayerHidden:actionBlock:] + 219
18 UIKitCore 0x00007fff246ac93d -[UIWindow _setHidden:forced:] + 362
19 UIKitCore 0x00007fff246bf950 -[UIWindow _mainQueue_makeKeyAndVisible] + 42
20 UIKitCore 0x00007fff248fa524 -[UIWindowScene _makeKeyAndVisibleIfNeeded] + 202
21 UIKitCore 0x00007fff23ace736 +[UIScene _sceneForFBSScene:create:withSession:connectionOptions:] + 1671
22 UIKitCore 0x00007fff2466ed47 -[UIApplication _connectUISceneFromFBSScene:transitionContext:] + 1114
23 UIKitCore 0x00007fff2466f076 -[UIApplication workspace:didCreateScene:withTransitionContext:completion:] + 289
24 UIKitCore 0x00007fff2415dbaf -[UIApplicationSceneClientAgent scene:didInitializeWithEvent:completion:] + 358
25 FrontBoardServices 0x00007fff25a6a136 -[FBSScene _callOutQueue_agent_didCreateWithTransitionContext:completion:] + 391
26 FrontBoardServices 0x00007fff25a92bfd __94-[FBSWorkspaceScenesClient createWithSceneID:groupID:parameters:transitionContext:completion:]_block_invoke.176 + 102
27 FrontBoardServices 0x00007fff25a77b91 -[FBSWorkspace _calloutQueue_executeCalloutFromSource:withBlock:] + 209
28 FrontBoardServices 0x00007fff25a928cb __94-[FBSWorkspaceScenesClient createWithSceneID:groupID:parameters:transitionContext:completion:]_block_invoke + 352
29 libdispatch.dylib 0x00000001054dfa88 _dispatch_client_callout + 8
30 libdispatch.dylib 0x00000001054e29d0 _dispatch_block_invoke_direct + 295
31 FrontBoardServices 0x00007fff25ab88f1 __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 30
32 FrontBoardServices 0x00007fff25ab85d7 -[FBSSerialQueue _targetQueue_performNextIfPossible] + 433
33 FrontBoardServices 0x00007fff25ab8a9c -[FBSSerialQueue _performNextFromRunLoopSource] + 22
34 CoreFoundation 0x00007fff203a8845 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
35 CoreFoundation 0x00007fff203a873d __CFRunLoopDoSource0 + 180
36 CoreFoundation 0x00007fff203a7c81 __CFRunLoopDoSources0 + 346
37 CoreFoundation 0x00007fff203a23f7 __CFRunLoopRun + 878
38 CoreFoundation 0x00007fff203a1b9e CFRunLoopRunSpecific + 567
39 GraphicsServices 0x00007fff2b793db3 GSEventRunModal + 139
40 UIKitCore 0x00007fff2466d40f -[UIApplication _run] + 912
41 UIKitCore 0x00007fff24672320 UIApplicationMain + 101
42 libswiftUIKit.dylib 0x00007fff53c487b2 $s5UIKit17UIApplicationMainys5Int32VAD_SpySpys4Int8VGGSgSSSgAJtF + 98
43 delcrash 0x000000010350100a $sSo21UIApplicationDelegateP5UIKitE4mainyyFZ + 122
44 delcrash 0x0000000103500f7e $s8delcrash11AppDelegateC5$mainyyFZ + 46
45 delcrash 0x0000000103501059 main + 41
46 libdyld.dylib 0x00007fff20257409 start + 1
47 ??? 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
*** Terminating app due to uncaught exception 'RLMException', reason: 'Cannot add an existing managed embedded object to a List.'
terminating with uncaught exception of type NSException
CoreSimulator 732.18 - Device: iPhone 8 (A8CA0A6C-C943-4C70-8EC4-EF9FC5E0F5F5) - Runtime: iOS 14.1 (18A8394) - DeviceType: iPhone 8
```
## Version of Realm and Tooling
Realm framework version: 10.1.2
Xcode version: 12
iOS/OSX version: 14
Dependency manager + version: SPM
Thank you for the information provided.