You are viewing an archived post.
Contents of this post may no longer be relevant or work as described.

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:

// 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