Automatic recreation of Realm DB during development

In a previous devlog I mentioned choosing Realm as backend for a project. I like it so far, but there has been a minor nuisance. During early development the layout of the DB changes all the time.

If you want to change the existing schema Realm requires a migration from old to new. This is important for production code. Writing a migration during early development for every minor change is tedious and overkill.

Time to automate! Realm exposes a deleteRealmIfMigrationNeeded configuration. You can set this config to true for debug builds and Realm will re-create the DB for you. Here is how I do it:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// AppDelegate.swift

// at the top add:
#if DEBUG
  // required to automatically recreate the DB during development
  // see func application() for more info
  import RealmSwift
#endif

// in func application(didFinishLaunchingWithOptions), add:
#if DEBUG
  // In debug builds, delete the realm if a migration is needed
  // Reasoning: The DB changes all the time during development,
  //            this way we don't have to manually delete the realm
  //            database all the time.
  Realm.Configuration.defaultConfiguration.deleteRealmIfMigrationNeeded = true
#endif

Here we use a simple DEBUG compiler flag. Debug-builds will have the code above added in the AppDelegate.swift file. Once our app starts and Realm notices a migration is needed it recreates the database for us.

Of course this removes all existing data and hides the need for migrations. I only recommend using this crutch for early stage development. After your schema is somewhat defined, or you released a version to the public, this will do more harm than good as you might miss required migration steps.

MacBook Pro on brown wooden table

Sending Sometimes Sundays

Subscribe to my newsletter for updates