Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Realm Migration doesn't work

Tags:

ios

realm

swift2

    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 realm = try! Realm()

This was put in application(application:didFinishLaunchingWithOptions:)

In my test program, I have changed the fields in my object. I would like to remove everything in the database, and move to the new field types. I've copied the code above from the documentation, but it appears to do nothing. I still get these errors:

fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=0 "Migration is required due to the following errors: 
- Property types for 'unit' property do not match. Old type 'string', new type 'int'
- Property 'reps' has been added to latest object model." UserInfo={NSLocalizedDescription=Migration is required due to the following errors: 
- Property types for 'unit' property do not match. Old type 'string', new type 'int'
- Property 'reps' 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/

Any ideas?

like image 707
user2179936 Avatar asked Jan 04 '16 19:01

user2179936


3 Answers

I had a similar issue happening where my app would crash despite the fact that I added the default migration code in didFinishLaunchingWithOptions

The problem was that I was indeed initializing an instance of Realm in my first view controller as a class level property. So removing that class level realm object from my first ViewController fixed the issue.

import UIKit
import RealmSwift

class ViewController: UIViewController{
  let db = try! Realm() // Removing this solved my issue

  func doSomething(){
    let db = try! Realm() // Placed this here instead
  }
}

I instead created the object inside the function that needed it, which is a better approach anyway.

like image 154
Geoherna Avatar answered Nov 10 '22 02:11

Geoherna


As long as you're in local development only, I'd recommend to reset your Realm database instead of doing a migration. Migrations are the way to go, if you have already shipped a version of your app with another schema and want to keep user data.

You can delete the database by deleting the app from the simulator or the device. Alternatively you can use NSFileManager to delete the Realm file before accessing the database.

let defaultPath = Realm.Configuration.defaultConfiguration.path!
try NSFileManager.defaultManager().removeItemAtPath(defaultPath)
like image 32
marius Avatar answered Nov 10 '22 01:11

marius


I also had this issue happening where my app would crash despite the fact that I added the default migration code in didFinishLaunchingWithOptions

As already stated here, the problem was that I was initializing an instance of Realm in my first view controller as a class level property.

BUT I couldn't just remove this instance and put it in the viewDidLoad, as I needed to use it in several functions.

The solution was actually to add the 'lazy' keyword, so the migration can be done before the initialization, as I found over here: https://www.selmanalpdundar.com/solution-of-realm-migration-error-code-10.html

import UIKit
import RealmSwift

class ViewController: UIViewController {
    lazy var realm = try! Realm() //added lazy and changed let to var
}
like image 22
AstridB Avatar answered Nov 10 '22 00:11

AstridB