Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Realm - Add file with initial data to project (iOS/Swift)

I'm developing an application for iOS using swift and chose Realm as a database solution for it. I wrote default data in AppDelegate using write/add function from realm docs and it works just fine. So after first launch I have a *.realm file with my initial data. In Realm documentation I found a section called "Bundling a Realm with an App", I add my *.realm file to project and to Build Phases as it written.

And I can't understand what I should do next (and part about compressing a *.realm file). I've tried to understand a code from Migration Example but I don't know Obj-C well.

Please give as clear steps as you can to add *.realm file with initial data to swift ios project and load this data to the Realm db with the first launch.

like image 849
Max Avatar asked May 27 '15 07:05

Max


2 Answers

Implement this function openRealm in AppDelegate and call it in

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    ...
    openRealm() 

    return true
 }

func openRealm() {

    let defaultRealmPath = Realm.defaultPath
    let bundleReamPath = NSBundle.mainBundle().resourcePath?.stringByAppendingPathComponent("default.realm")

    if !NSFileManager.defaultManager().fileExistsAtPath(defaultRealmPath) {
        NSFileManager.defaultManager().copyItemAtPath(bundleReamPath!, toPath: defaultRealmPath, error: nil)
    }
}

It will copy your realm file that you bundled in the app to the default realm path, if it doesn't exist already. After that you use Realm normally like you used before.

There's also the Migration example that you talked about in Swift.

In Swift 3.0.1 you may prefer this:

    let defaultRealmPath = Realm.Configuration.defaultConfiguration.fileURL!
    let bundleRealmPath = Bundle.main.url(forResource: "seeds", withExtension: "realm")

    if !FileManager.default.fileExists(atPath: defaultRealmPath.absoluteString) {
        do {
            try FileManager.default.copyItem(at: bundleRealmPath!, to: defaultRealmPath)
        } catch let error {
            print("error copying seeds: \(error)")
        }
    }

(but please be careful with the optionals)

like image 135
pteofil Avatar answered Nov 10 '22 13:11

pteofil


Swift version 3, courtesy of Kishikawa Katsumi:

let defaultRealmPath = Realm.Configuration.defaultConfiguration.fileURL!
let bundleReamPath = Bundle.main.path(forResource: "default", ofType:"realm")

if !FileManager.default.fileExists(atPath: defaultRealmPath.path) {
do
{
    try FileManager.default.copyItem(atPath: bundleReamPath!, toPath: defaultRealmPath.path)
}
catch let error as NSError {
    // Catch fires here, with an NSError being thrown
    print("error occurred, here are the details:\n \(error)")
}
}
like image 33
Apocal Avatar answered Nov 10 '22 13:11

Apocal