Swift Realm,以正确的方式加载预先填充的数据库?

时间:2016-04-15 04:32:35

标签: swift realm

我对ios开发很新。

我遵循此migration example来使用预先填充的数据库并稍微更改代码

这是我在AppDelegate -> func application

上使用的最终代码
    let defaultPath = Realm.Configuration.defaultConfiguration.path!
    let path = NSBundle.mainBundle().pathForResource("default", ofType: "realm")

    if let bundledPath = path {

        print("use pre-populated database")
        do {
            try NSFileManager.defaultManager().removeItemAtPath(defaultPath)
            try NSFileManager.defaultManager().copyItemAtPath(bundledPath, toPath: defaultPath)

        } catch {
            print("remove")
            print(error)
        }
    }

我正在用真实设备测试它。

它可以工作,但根据代码逻辑,它将始终重置为预先填充的数据库。这已经过验证:应用程序重启后数据会重置。

我尝试moveItemAtPath而不是copyItemAtPath。权限错误

我试图在复制后删除预先填充的数据库文件。权限错误

我尝试使用预先填充的数据库文件作为域默认配置路径。错误也会发生。

3 个答案:

答案 0 :(得分:9)

Swift 3.0 中,试试这个:

    let bundlePath = Bundle.main.path(forResource: "default", ofType: "realm")
    let destPath = Realm.Configuration.defaultConfiguration.fileURL?.path
    let fileManager = FileManager.default

    if fileManager.fileExists(atPath: destPath!) {
        //File exist, do nothing
        //print(fileManager.fileExists(atPath: destPath!))
    } else {
        do {
            //Copy file from bundle to Realm default path
            try fileManager.copyItem(atPath: bundlePath!, toPath: destPath!)
        } catch {
            print("\n",error)
        }
    }

答案 1 :(得分:2)

是的,你的逻辑是正确的。每次执行此代码时,将删除Documents目录中的默认Realm文件,并替换为app bundle附带的静态副本。这是通过Realm示例代码中的设计完成的,以便在每次启动应用程序时演示迁移过程。

如果您只希望这种情况发生一次,最简单的方法是事先检查Realm文件是否已存在于默认路径中,然后仅在 isn'时执行复制t 已经存在。 :)

def change
   change_column :events, :organiser_profile :string

end

def up
  change_column :events, :organiser_profile, :string
end

def down
  change_column :events, :organiser_profile, :url
end

答案 2 :(得分:0)

尝试

    let realm_db_path     = Realm.Configuration.defaultConfiguration.fileURL!
    let bundle_realm_path = Bundle.main.url(forResource: "default", withExtension: "realm")!

    if !FileManager.default.fileExists(atPath: realm_db_path.absoluteString){
        do {

            try FileManager.default.copyItem(at: bundle_realm_path, to: realm_db_path)

        }catch let error {

            NSLog(error as! String)

        }