我对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
。权限错误
我试图在复制后删除预先填充的数据库文件。权限错误
我尝试使用预先填充的数据库文件作为域默认配置路径。错误也会发生。
答案 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)
}