3lvis / Sync

JSON to Core Data and back. Swift Core Data Sync.
MIT License
2.55k stars 262 forks source link

Sync crashes for new native UUID primary key introduced in iOS 11 #469

Closed ewstrand closed 6 years ago

ewstrand commented 6 years ago

When using the new UUID native type for primary key apps using sync will load once but it is failing in a silent fashion since all of the id fields are set as NULL which leads to the app crashing on all subsequent loads.

3lvis commented 6 years ago

Hi @ewstrand,

I'm not sure I understand could you share a code example?

ewstrand commented 6 years ago

In my app and also in the sample code "iOS Demo" sync does not seem to parse in the uuid string of form "5042fbd9-f85b-4422-b276-02f949f1bc59" even when you change the type of the entity id property to the type of UUID. I modified the sample program as follows:

I changed the project target to iOS 11 for support for the new UUID type in core data, I changed the data model as follows:

screen shot 2018-01-17 at 1 17 50 pm

I changed the user.json file to: [ { "id": "5042fbd9-f85b-4422-b276-02f949f1bc59", "name": "Leanne Graham", "username": "Bret", "email": "Sincere@april.biz", "address": { "street": "Kulas Light", "suite": "Apt. 556", "city": "Gwenborough", "zipcode": "92998-3874", "geo": { "lat": "-37.3159", "lng": "81.1496" } }, "phone": "1-770-736-8031 x56442", "website": "hildegard.org", "company": { "name": "Romaguera-Crona", "catchPhrase": "Multi-layered client-server neural-net", "bs": "harness real-time e-markets" } }, { "id": "4cd1242c-ab25-43ef-983c-b60977195298", "name": "Ervin Howell", "username": "Antonette", "email": "Shanna@melissa.tv", "address": { "street": "Victor Plains", "suite": "Suite 879", "city": "Wisokyburgh", "zipcode": "90566-7771", "geo": { "lat": "-43.9509", "lng": "-34.4618" } }, "phone": "010-692-6593 x09125", "website": "anastasia.net", "company": { "name": "Deckow-Crist", "catchPhrase": "Proactive didactic contingency", "bs": "synergize scalable supply-chains" } }, { "id": "b13e00b9-ebd6-4a13-9eec-4ccc6261693c", "name": "Clementine Bauch", "username": "Samantha", "email": "Nathan@yesenia.net", "address": { "street": "Douglas Extension", "suite": "Suite 847", "city": "McKenziehaven", "zipcode": "59590-4157", "geo": { "lat": "-68.6102", "lng": "-47.0653" } }, "phone": "1-463-123-4447", "website": "ramiro.info", "company": { "name": "Romaguera-Jacobson", "catchPhrase": "Face to face bifurcated interface", "bs": "e-enable strategic applications" } }, { "id": "2b808bb3-2ee9-4932-aa26-774e677e1baa", "name": "Patricia Lebsack", "username": "Karianne", "email": "Julianne.OConner@kory.org", "address": { "street": "Hoeger Mall", "suite": "Apt. 692", "city": "South Elvis", "zipcode": "53919-4257", "geo": { "lat": "29.4572", "lng": "-164.2990" } }, "phone": "493-170-9623 x156", "website": "kale.biz", "company": { "name": "Robel-Corkery", "catchPhrase": "Multi-tiered zero tolerance productivity", "bs": "transition cutting-edge web services" } }, { "id": "ff5cc05e-4ef5-4123-bc22-d90eb2dc3b79", "name": "Chelsey Dietrich", "username": "Kamren", "email": "Lucio_Hettinger@annie.ca", "address": { "street": "Skiles Walks", "suite": "Suite 351", "city": "Roscoeview", "zipcode": "33263", "geo": { "lat": "-31.8129", "lng": "62.5342" } }, "phone": "(254)954-1289", "website": "demarco.info", "company": { "name": "Keebler LLC", "catchPhrase": "User-centric fault-tolerant solution", "bs": "revolutionize end-to-end systems" } }, { "id": "551f7575-60f5-46af-a095-ababbda13ffd", "name": "Mrs. Dennis Schulist", "username": "Leopoldo_Corkery", "email": "Karley_Dach@jasper.info", "address": { "street": "Norberto Crossing", "suite": "Apt. 950", "city": "South Christy", "zipcode": "23505-1337", "geo": { "lat": "-71.4197", "lng": "71.7478" } }, "phone": "1-477-935-8478 x6430", "website": "ola.org", "company": { "name": "Considine-Lockman", "catchPhrase": "Synchronised bottom-line interface", "bs": "e-enable innovative applications" } }, { "id": "6fb0f23e-21c7-4574-b733-30cc789442bd", "name": "Kurtis Weissnat", "username": "Elwyn.Skiles", "email": "Telly.Hoeger@billy.biz", "address": { "street": "Rex Trail", "suite": "Suite 280", "city": "Howemouth", "zipcode": "58804-1099", "geo": { "lat": "24.8918", "lng": "21.8984" } }, "phone": "210.067.6132", "website": "elvis.io", "company": { "name": "Johns Group", "catchPhrase": "Configurable multimedia task-force", "bs": "generate enterprise e-tailers" } }, { "id": "00363dc5-986f-4c9c-a838-2c4172e5586e", "name": "Nicholas Runolfsdottir V", "username": "Maxime_Nienow", "email": "Sherwood@rosamond.me", "address": { "street": "Ellsworth Summit", "suite": "Suite 729", "city": "Aliyaview", "zipcode": "45169", "geo": { "lat": "-14.3990", "lng": "-120.7677" } }, "phone": "586.493.6943 x140", "website": "jacynthe.com", "company": { "name": "Abernathy Group", "catchPhrase": "Implemented secondary concept", "bs": "e-enable extensible e-tailers" } }, { "id": "2b21dd8f-d1fe-4992-9083-53afa6658832", "name": "Glenna Reichert", "username": "Delphine", "email": "Chaim_McDermott@dana.io", "address": { "street": "Dayna Park", "suite": "Suite 449", "city": "Bartholomebury", "zipcode": "76495-3109", "geo": { "lat": "24.6463", "lng": "-168.8889" } }, "phone": "(775)976-6794 x41206", "website": "conrad.com", "company": { "name": "Yost and Sons", "catchPhrase": "Switchable contextually-based project", "bs": "aggregate real-time technologies" } }, { "id": "9bb4eb5a-e5df-4ac9-961b-2f8d0a38d6a8", "name": "Clementina DuBuque", "username": "Moriah.Stanton", "email": "Rey.Padberg@karina.biz", "address": { "street": "Kattie Turnpike", "suite": "Suite 198", "city": "Lebsackbury", "zipcode": "31428-2261", "geo": { "lat": "-38.2386", "lng": "57.2232" } }, "phone": "024-648-3804", "website": "ambrose.net", "company": { "name": "Hoeger LLC", "catchPhrase": "Centralized empowering task-force", "bs": "target end-to-end models" } } ]

When you run the program at first it seems to work as seen here: screen shot 2018-01-17 at 1 30 16 pm

but when you examine the raw DataModel.sqlite file you find that all of the id fields contain NULL as seen here: screen shot 2018-01-17 at 1 32 55 pm

All of this happens without any errors being thrown. It is not until you quit the app and relaunch it that the following error is raised: screen shot 2018-01-17 at 1 36 56 pm

ewstrand commented 6 years ago

Ok I tracked down the error and I have a fix. The problem was in the "NSManagedObject+PropertyMapperHelpers.m" file; it was missing a case for handling the UUID type. Here is the file with the fixes:

NSManagedObject+PropertyMapperHelpers.m.zip

my added fixes are on lines: 26,27 , 210,211 , 233,234

3lvis commented 6 years ago

@ewstrand thanks for your contribution!

https://github.com/3lvis/Sync/pull/472