Данные области не отображаются на физическом устройстве - PullRequest
0 голосов
/ 23 мая 2018

Я разрабатываю приложение с помощью realmSwift.Я хочу сначала установить предустановленные данные в области db, а затем, когда пользователь откроет приложение, и сделать его доступным для записи, он будет отображаться.Я пишу некоторый код, основанный на других вопросах о связке областей.например, Realm - Добавить файл с исходными данными в проект (iOS / Swift) и Realm fileExists всегда имеет значение Тогда мне удалось сделать то, что я хочу, на симуляторе, но это не такработать на физическом устройстве.Это код, который я написал в AppDelegate

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {


    openRealm()

    let config = Realm.Configuration(

        fileURL: Bundle.main.url(forResource: "default", withExtension: "realm"),

        readOnly: true)

    var realm = try! Realm(configuration: config)


    print(Realm.Configuration.defaultConfiguration.fileURL)

    return true
}

func openRealm() {

    let realm = try! Realm()
    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("File exist")

        try! fileManager.removeItem(atPath: destPath!)

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


    } else {
        do {
            try fileManager.copyItem(atPath: bundlePath!, toPath: destPath!)
            print("Copied")
        } catch {
            print("\n",error)
        }
    }



}

1 Ответ

0 голосов
/ 23 мая 2018

Есть 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...