Search code examples
iosdatabaseswift3realmxcode8

Deleting Data instead of using Migration


Deleting Data instead of using Migration

In my code I added a property to my realm class. Is there a way to delete the data and get rid off my whole database instead of using migration?

I'm still testing that's why I probably won't need Migration for now.

Please help me, I'm really struggling with using Migration

Thank you


Solution

  • if you are only testing locally you can delete the app and re-install. If you already have your app on the App Store and want to prepare migrations for users you can have a look at the Migrations Sample App from Realm.

    Try this on your AppDelegate:

    import UIKit
    import RealmSwift
    
    // Old data models
    /* V0
    class Person: Object {
        dynamic var firstName = ""
        dynamic var lastName = ""
        dynamic var age = 0
    }
    */
    
    // V1
    class Person: Object {
        dynamic var fullName = ""        // combine firstName and lastName into single field
        dynamic var age = 0
    }
    
    
    class Person: Object {
        dynamic var fullName = ""
        dynamic var age = 0
    }
    
    func bundleURL(_ name: String) -> URL? {
        return Bundle.main.url(forResource: name, withExtension: "realm")
    }
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
    
        var window: UIWindow?
    
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
            window = UIWindow(frame: UIScreen.main.bounds)
            window?.rootViewController = UIViewController()
            window?.makeKeyAndVisible()
    
            // copy over old data files for migration
            let defaultURL = Realm.Configuration.defaultConfiguration.fileURL!
            let defaultParentURL = defaultURL.deletingLastPathComponent()
    
            if let v0URL = bundleURL("default-v0") {
                do {
                    try FileManager.default.removeItem(at: defaultURL)
                    try FileManager.default.copyItem(at: v0URL, to: defaultURL)
                } catch {}
            }
    
            // define a migration block
            // you can define this inline, but we will reuse this to migrate realm files from multiple versions
            // to the most current version of our data model
            let migrationBlock: MigrationBlock = { migration, oldSchemaVersion in
                if oldSchemaVersion < 1 {
                    migration.enumerateObjects(ofType: Person.className()) { oldObject, newObject in
                        if oldSchemaVersion < 1 {
                            // combine name fields into a single field
                            let firstName = oldObject!["firstName"] as! String
                            let lastName = oldObject!["lastName"] as! String
                            newObject?["fullName"] = "\(firstName) \(lastName)"
                        }
                    }
                }
                print("Migration complete.")
            }
    
            Realm.Configuration.defaultConfiguration = Realm.Configuration(schemaVersion: 2, migrationBlock: migrationBlock)
    
            // print out all migrated objects in the default realm
            // migration is performed implicitly on Realm access
            print("Migrated objects in the default Realm: \(try! Realm().objects(Person.self))")
    
            return true
        }
    }