Search code examples
swiftios8realmrealm-migration

How to add a field to the schema of a Realm database?


I am seeking to add another property to my Realm database scheme (pointed to by the arrow) while at the same time learn how to use the migration functionality.

class FeesPaid: Object {
    dynamic var fileNumber = ""
    dynamic var forMonth = ""
    dynamic var amount: Float = 0.0
    dynamic var balance: Float = 0.0   <-------
    dynamic var date = ""
}

I have been following the instructions at Realm.io and I have copied the code in the first block and placed it into the my "application(application:didFinishLaunchingWithOptions:)" function which is located in the "AppDelegate.swift" file.

let config = Realm.Configuration(
   // Set the new schema version. This must be greater than the previously used
   // version (if you've never set a schema version before, the version is 0).
   schemaVersion: 1,

   // Set the block which will be called automatically when opening a Realm with
   // a schema version lower than the one set above
   migrationBlock: { migration, oldSchemaVersion in
      // We haven’t migrated anything yet, so oldSchemaVersion == 0
      if (oldSchemaVersion < 1) {
          // Nothing to do!
          // Realm will automatically detect new properties and removed properties
          // And will update the schema on disk automatically
      }
   }
)

// Tell Realm to use this new configuration object for the default Realm
Realm.Configuration.defaultConfiguration = config

// Now that we've told Realm how to handle the schema change, opening the file
// will automatically perform the migration
let clients = try! Realm()

The statement just below this block on the Realm web site states:
"At the very minimum all we need to do is to update the version with an empty block to indicate that the schema has been upgraded (automatically) by Realm."
(This statement of nothing else needing to be done seems to be supported by the comments within the if statement, above.)

Yet when I run my app I keep getting the error:

fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=0 "Migration is required for object type 'FeesPaid' due to the following errors:
- Property 'balance' has been added to latest object model." UserInfo={NSLocalizedDescription=Migration is required for object type 'FeesPaid' due to the following errors:
- Property 'balance' has been added to latest object model.}: file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-700.1.101.15/src/swift/stdlib/public/core/ErrorType.swift, line 50

So what am I doing wrong?

I don't need to enumerate or pre-fill in any values in the new field. I simply need the new field in my scheme.


Solution

  • I compared your code against the examples in the docs and the sample code and it looks fine. By all accounts that should be working.

    The only thing I can think of is that that Realm object may be getting called elsewhere in your app before it's been configured in your app delegate. This is possible if your app employs storyboards and you have any Realm code in a view controller viewDidLoad method as this gets loaded before your app delegate is triggered. If that's the case, it's usually quite easy to solve as all you need to do is manually set up and present your storyboard at the end of application(application:didFinishLaunchingWithOptions:)

    Failing that, what esthepiking said is correct. You can increment the schema version during testing, or if you know your schema changes are going to be very volatile during development, you can also simply delete it each time on app launch.