Есть 3 проблемы с вашим кодом: во-первых, вы не должны использовать часть true
вашей ветви if, поскольку вы запускаете openRealm()
из applicationDidFinishLaunching
вашего AppDelegate и до того, как вы сделаетелюбые вызовы Realm
единственная причина, по которой может существовать файл default.realm
, заключается в том, что ваше приложение не запускается в первый раз, поэтому вы не должны перезаписывать его.
Во-вторых, вы не должнывызывать let realm = try! Realm()
в начале вашей openRealm
функции, так как это на самом деле создаст realm
, что усложнит его, чем нужно было бы обнаружить, если предварительно заполненный файл .realm
уже скопирован в defaultPath
или нет.На самом деле вам вообще не нужно вызывать try! Realm()
в функции openRealm()
, если только вы не хотите выполнить миграцию до того, как ваше Царство может быть открыто из любого места в вашем коде.
func openRealm() {
let bundlePath = Bundle.main.path(forResource: "default", ofType: "realm")!
let defaultPath = Realm.Configuration.defaultConfiguration.fileURL?.path!
let fileManager = FileManager.default
// Only need to copy the prepopulated `.realm` file if it doesn't exist yet
if !fileManager.fileExists(atPath: defaultPath){
print("use pre-populated database")
do {
try fileManager.copyItem(atPath: bundlePath, toPath: defaultPath)
print("Copied")
} catch {
print(error)
}
}
Наконец,вам не следует создавать новую конфигурацию, в которой вы перезаписываете путь Realm
своим bundlePath
, поскольку файлы в комплекте приложений никогда не должны изменяться (это нарушит вашу подпись кода).Более того, вы уже скопировали предварительно заполненный файл из пакета приложения в defaultPath
Realm, поэтому, если вы просто позвоните Realm()
, он будет изменять предварительно заполненный файл, поскольку он хранится в расположении по умолчанию.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
openRealm()
print(Realm.Configuration.defaultConfiguration.fileURL)
return true
}