Inform users that they need to delete and reinstall the app

Hi, My app has been on the store for a few months now with a few updates.

Now I plan a major update that will affect the structure of core data itself (key attribute replaced by relationship). I see no other way than asking the users to delete and reinstall the app to reset all data and start it as new.

In a previous update I provided users the possibility to backup their data in a file so they can restore it with the future release.

Is there a better way than using the "What's new in this version" section to pass the message to the users ?

There could be, with some additional development.

  • In the new version, put code to read old data
  • When new app launches, read data.
  • If old data exists, automatically save in a temporary file and convert old data to new structure.
  • delete old data in the app
  • If you cannot convert all data, propose user to save in a file (save temporary file permanently). Otherwise, delete the temporary file.

Make sure you test this extensively. It is really a bad user experience to loose data and no way to retrieve.

Yo'll have to keep this mechanism in place for a few releases, as users may update only in a future release.

As a user, being told to delete an app and reinstall a new version is a terrible experience. I am more than likely to just delete your app unless it's something I desperately need.

But, can't you do this with Core Data migration? I've done it before.

  • Create a new version of your model.
  • Create a mapping model that maps from your old version to the new one.
  • Tell Core Data how to manage the data changes.

Let's say you have this in version 1:

name: String
joinDate: Date
detailsId: String

and you want to have a new Details entity and join them up, version 2 would be something like this:

name: String
joinDate: Date
detailsId: String  // You can leave this for now, and delete it in a later mapping model
details:  // Relationship to new Details entity, which is:

// Details entity:
id: String  // Copy the detailsId from version 1 to here
// Fill out the rest of the entity with default values, or migrations from the original entity

Is that not possible?

I came up providing the user with a "backup" function they have to trigger to save all data in a file. Still considering the user will have to delete and reinstall the app, the backup file needs to be saved outside the app. Therefore I use ShareLink and leave it the user to save it in the appropriate place. Then at relaunching the new app, the possibility is offered the user either to start from scratch or load the backup file with a file picker. I tried to reload the backup file without reinstallation of the app. The problem I faced was when removing the old data from core using a batchDeleteRequest. It generated exceptions in other views (especially the one displaying the content of the database). Whereas when relaunching the app after reinstallation, core data is empty yet no exception is generated.

Inform users that they need to delete and reinstall the app
 
 
Q