I am using NSPersistentCloudKitContainer, and have a many-to-one optional relationship, let say many "item" to one "project".
This relationship is optional, so I can do this ->
item.project = nil
when the user decided that this item does not belongs to any project.
This code is fine in Core Data, and the inverse relationships are updated accordingly.
However, once this gets synced to CloudKit, and come back down, the "project relationship" will be restored. Setting the project to other entities are fine, it just cannot be set to "nil".
Playing with the CloudKit dashboard, I realized that the schema that is created have a CD_Project as String. If I create a new item without any project, there's no such field, however, once I assign a project to an item, the field is set, and there is no way to unset this field, even from the CloudKit Dashboard. I naively tried to clear out the string in cloudkit dashboard but it crashes my app when the sync happens.
Is this a bug that will be fixed? The issue is also posted by another developer here:
I have a few workaround ideas but they all require extra work, and seems to confuse readers of the code in the future:
1. change it to many-to-many instead
2. have a special project that means "No Project"
3. have a field in item named "projectIsNil"