Realm - добавить файл с исходными данными в проект (iOS/Swift)
Я разрабатываю приложение для iOS, используя swift, и выбрал Realm в качестве решения для базы данных. Я написал данные по умолчанию в AppDelegate, используя функцию write/add из realm docs, и это работает отлично. Поэтому после первого запуска у меня есть файл *.realm с моими исходными данными. В документации Realm я нашел раздел под названием "Объединение королевства с помощью приложения" , я добавляю свой файл *.realm для создания проекта и создания фаз по его написанию.
И я не могу понять, что я должен делать дальше (и часть о сжатии файла *.realm). Я попытался понять код из Пример миграции, но я не знаю Obj-C хорошо.
Просьба дать как можно более четкие шаги, чтобы добавить файл *.realm с исходными данными в проект swift ios и загрузить эти данные в базу данных Realm с первого запуска.
Ответы
Ответ 1
Внедрить эту функцию openRealm
в AppDelegate и вызвать ее в
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
...
openRealm()
return true
}
func openRealm() {
let defaultRealmPath = Realm.defaultPath
let bundleReamPath = NSBundle.mainBundle().resourcePath?.stringByAppendingPathComponent("default.realm")
if !NSFileManager.defaultManager().fileExistsAtPath(defaultRealmPath) {
NSFileManager.defaultManager().copyItemAtPath(bundleReamPath!, toPath: defaultRealmPath, error: nil)
}
}
Он скопирует ваш файл в реальном времени, который вы добавили в приложение, в путь по умолчанию, если он еще не существует. После этого вы обычно используете Realm, как раньше.
Там также пример миграции, о котором вы говорили в Swift.
В Swift 3.0.1 вы можете предпочесть это:
let defaultRealmPath = Realm.Configuration.defaultConfiguration.fileURL!
let bundleRealmPath = Bundle.main.url(forResource: "seeds", withExtension: "realm")
if !FileManager.default.fileExists(atPath: defaultRealmPath.absoluteString) {
do {
try FileManager.default.copyItem(at: bundleRealmPath!, to: defaultRealmPath)
} catch let error {
print("error copying seeds: \(error)")
}
}
(но будьте осторожны с опциями)
Ответ 2
И для тех, кому нужен @pteofil ответ в Objective-c
- (void)openRealm {
NSString *defaultRealmPath = [RLMRealm defaultRealm].path;
NSString *bundleRealmPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"default.realm"];
if(![[NSFileManager defaultManager] fileExistsAtPath:defaultRealmPath]) {
[[NSFileManager defaultManager] copyItemAtPath:bundleRealmPath toPath:defaultRealmPath error:nil];
}
}
Ответ 3
Быстрая версия 3, любезно предоставлена Кишикава Кацуми:
let defaultRealmPath = Realm.Configuration.defaultConfiguration.fileURL!
let bundleReamPath = Bundle.main.path(forResource: "default", ofType:"realm")
if !FileManager.default.fileExists(atPath: defaultRealmPath.path) {
do
{
try FileManager.default.copyItem(atPath: bundleReamPath!, toPath: defaultRealmPath.path)
}
catch let error as NSError {
// Catch fires here, with an NSError being thrown
print("error occurred, here are the details:\n \(error)")
}
}
Ответ 4
Обновление функции @pteofil openRealm для Swift 2.2/Realm 1.0.2:
func openRealm() {
let defaultURL = Realm.Configuration.defaultConfiguration.fileURL!
let bundleReamPath = NSBundle.mainBundle().URLForResource("default", withExtension: "realm")
if !NSFileManager.defaultManager().fileExistsAtPath(defaultURL.path!) {
do {
try NSFileManager.defaultManager().copyItemAtURL(bundleReamPath!, toURL: defaultURL)
}
catch {}
}
}
Ответ 5
Работайте на корпоративном пространстве, мне нужно открыть Realm для каждого приложения без повторного использования Realm во всех приложениях, поэтому я поставил это вместе для Swift 3.0. Добавьте эту функцию в AppDelegate.
func openRealm()
{
let appName = "ApplcationNameGoesHere"
var rlmConfig = Realm.Configuration()
let defaultRealmPath = Realm.Configuration.defaultConfiguration.fileURL!
let appRealmPath = defaultRealmPath.deletingLastPathComponent().appendingPathComponent("\(appName).realm")
if !FileManager.default.fileExists(atPath: appRealmPath.path) {
// Use the default directory, but replace the filename with the application name: appName
rlmConfig.fileURL = rlmConfig.fileURL!.deletingLastPathComponent().appendingPathComponent("\(appName).realm")
}else
{
rlmConfig.fileURL = appRealmPath
}
// Set this as the configuration used for the default Realm
Realm.Configuration.defaultConfiguration = rlmConfig
}// open the Realm database for the application
Приведенный выше код открывает или создает Realm с именем файла "ApplicationNameGoesHere.realm" на основе переменной appName в этом примере.
place
openRealm() before return true in application: didFinishLaunchingWithOptions
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
openRealm()
return true
}
вызовите его в другом классе следующим образом:
let uiRealm = try! Realm()
Ответ 6
Если вы хотите открыть его прямо из местоположения пучка и не потрудите его копировать по пути Realm по умолчанию, посмотрите на реализацию здесь