Я новичок в Realm, и я хочу отправить предварительно связанный файл Realm моего приложения, однако realm documentation неясно, как на самом деле создать файл .realm, а также загрузить в него нужные предварительно собранные данные. Я не смог найти решение через SO, Google или Youtube. Пошаговые инструкции были бы очень полезными.Как создать файл с предустановленным пакетом и загрузить данные на него?
ответ
Мы по-прежнему смотрим на способы официально сделать генерацию предварительно заполненных областей сложнее. Это определенно желаемая функция для браузера 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 будет напечатано в консоли, чтобы я мог его захватить и переместить в пакет приложений.
Благодарим за отзыв. У меня есть база данных Parse, в которой я запрашиваю несколько коллекций, и в настоящее время у меня есть метод, который запускает все запросы сразу (когда пользователь входит в систему), можно ли поместить данные из разных коллекций в один и тот же файл .realm? Если да, то каким образом я могу извлечь данные из моего метода и сохранить его в файл? Также к чему относится XCTAssert? @TiM –
Не беспокойтесь! Если это ответит на ваш вопрос, не забудьте принять его. :) Ага! Это должно быть возможно. Я предполагаю, что Parse просто вызывает локальный метод в вашем приложении, когда запрос завершается. В этот момент вы просто скопировали данные в Realm с помощью транзакции записи как обычно. Если вы собираетесь писать в предварительно связанное Королевство, вам придется скопировать его в раздел в вашем приложении, где вам разрешено записывать данные. Скорее всего, в папке «Документы». – TiM
Мне удалось создать файл в комплекте, но он огромный (68 ГБ), и я хочу сжать его, чтобы добавить его в свой проект. Каков наилучший способ сделать это? В документах говорится, что он использует 'Realm(). WriteCopy. (ToFile: _, encryptionKey:)', но мой путь к файлу очень длинный, и я получаю сообщение об ошибке, что я не могу поместить строку для своего пути. Некоторые советы будут высоко оценены. @TiM –