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 по умолчанию, посмотрите на реализацию здесь