2017-02-14 9 views
1

Я новичок в Realm, и я хочу отправить предварительно связанный файл Realm моего приложения, однако realm documentation неясно, как на самом деле создать файл .realm, а также загрузить в него нужные предварительно собранные данные. Я не смог найти решение через SO, Google или Youtube. Пошаговые инструкции были бы очень полезными.Как создать файл с предустановленным пакетом и загрузить данные на него?

ответ

3

Мы по-прежнему смотрим на способы официально сделать генерацию предварительно заполненных областей сложнее. Это определенно желаемая функция для браузера Realm, но из-за того, как файлы Realm требуют миграции при изменении схемы, несколько сложно включить в пользовательский интерфейс. Это определенно то, что мы хотим улучшить по линии.

В настоящий момент браузер имеет a converter in it, который может выполнять минимальный импорт данных, например, файлы CSV.

В документации Realm говорится, что самый простой способ создать предварительно заполненную область, специфичную для ваших приложений, - это создать отдельное приложение macOS, единственной задачей которого является создание файла Realm, предварительно заполнение данных и затем выведите полученный файл Realm, чтобы скопировать его в свое приложение.

Операция, выполняемая так же, как любое нормальное взаимодействие с Realm (try! Realm() - это то, что заставляет файл на самом деле быть изначально создан), за исключением того, что вы вручную взаимодействуете с файлом Realm на диске после его завершения.

Я работаю над приложением для конференции iOS, и данные о расписании для мероприятия будут храниться в царстве, которое предварительно связано с приложением, когда оно отправляется.

Поскольку я думал, что создание дополнительного приложения macOS будет излишним для приложения iOS, вместо этого я использовал модульные тесты iOS, которые будут генерировать предварительно скомпилированное Realm с нуля каждый раз, когда он будет выполнен.

class Tests: XCTestCase { 
    func testGenerateNewDefaultRealm() { 
     let sources = [conferences, sponsors, conferenceDays] as [Any] 
     XCTAssert(generateDefaultRealm(named: "MyConferenceRealm.realm", sources: sources)) 
    } 
} 

extension Tests { 
    public func generateDefaultRealm(named name: String, sources: [Any]) -> Bool { 
     // Create and configure the Realm file we'll be writing to 
     let realm = generateRealm(named: name) 

     // Open a Realm write transaction 
     realm.beginWrite() 

     // Loop through each source and add it to Realm 
     for source in sources { 
      if let objectArray = source as? [Object] { 
       for object in objectArray { 
        realm.add(object) 
       } 
      } 
      else if let objectDictionary = source as? [String : Object] { 
       for (_, object) in objectDictionary { 
        realm.add(object) 
       } 
      } 
     } 

     // Commit the write transaction 
     do { 
      try realm.commitWrite() 
     } 
     catch let error { 
      print(error.localizedDescription) 
      return false 
     } 

     // Print the file location of the generated Realm 
     print("=====================================================================") 
     print(" ") 
     print("Successfully generated at") 
     print(realm.configuration.fileURL!.path) 
     print(" ") 
     print("=====================================================================") 

     return true 
    } 

    public func generateRealm(named name: String) -> Realm { 
     let exportPath = NSTemporaryDirectory() 
     let realmPath = exportPath.appending(name) 

     // Delete previous Realm file 
     if FileManager.default.fileExists(atPath: realmPath) { 
      try! FileManager.default.removeItem(atPath: realmPath) 
     } 

     // Create new Realm file at path 
     let objectTypes: [Object.Type] = [Conference.self, ConferenceDay.self, SessionBlock.self, Event.self, Presentation.self, 
              Session.self, Location.self, Speaker.self, Sponsor.self, Venue.self] 
     let configuration = Realm.Configuration(fileURL: URL(string: realmPath), objectTypes: objectTypes) 
     let realm = try! Realm(configuration: configuration) 
     return realm 
    } 
} 

Запуск этого модульного тестирования создаст новый файл Realm в NSTemporaryDirectory() каталоге Mac, а затем кормить в наборе Array и Dictionary объектов не-сохранялись Realm Object экземпляров, которые создаются каждый раз, когда тест запускается. Затем местоположение конечного Realm будет напечатано в консоли, чтобы я мог его захватить и переместить в пакет приложений.

+0

Благодарим за отзыв. У меня есть база данных Parse, в которой я запрашиваю несколько коллекций, и в настоящее время у меня есть метод, который запускает все запросы сразу (когда пользователь входит в систему), можно ли поместить данные из разных коллекций в один и тот же файл .realm? Если да, то каким образом я могу извлечь данные из моего метода и сохранить его в файл? Также к чему относится XCTAssert? @TiM –

+0

Не беспокойтесь! Если это ответит на ваш вопрос, не забудьте принять его. :) Ага! Это должно быть возможно. Я предполагаю, что Parse просто вызывает локальный метод в вашем приложении, когда запрос завершается. В этот момент вы просто скопировали данные в Realm с помощью транзакции записи как обычно. Если вы собираетесь писать в предварительно связанное Королевство, вам придется скопировать его в раздел в вашем приложении, где вам разрешено записывать данные. Скорее всего, в папке «Документы». – TiM

+0

Мне удалось создать файл в комплекте, но он огромный (68 ГБ), и я хочу сжать его, чтобы добавить его в свой проект. Каков наилучший способ сделать это? В документах говорится, что он использует 'Realm(). WriteCopy. (ToFile: _, encryptionKey:)', но мой путь к файлу очень длинный, и я получаю сообщение об ошибке, что я не могу поместить строку для своего пути. Некоторые советы будут высоко оценены. @TiM –

 Смежные вопросы

  • Нет связанных вопросов^_^