2016-04-15 2 views
7

Я довольно новичок в развитии ios.Swift Realm, загрузите предварительно заполненную базу данных правильным способом?

Я следовать этому migration example использовать предварительно заполненные базы данных и изменить код немного

вот окончательный код, который я использую на AppDelegate -> func application

let defaultPath = Realm.Configuration.defaultConfiguration.path! 
    let path = NSBundle.mainBundle().pathForResource("default", ofType: "realm") 

    if let bundledPath = path { 

     print("use pre-populated database") 
     do { 
      try NSFileManager.defaultManager().removeItemAtPath(defaultPath) 
      try NSFileManager.defaultManager().copyItemAtPath(bundledPath, toPath: defaultPath) 

     } catch { 
      print("remove") 
      print(error) 
     } 
    } 

Я проверяю это в реальном устройстве ,

Он работает, но в соответствии с логикой кода он всегда будет сбрасываться в предварительно заполненную базу данных. Это проверено: данные перезагружаются после перезапуска приложения.

Я пробовал moveItemAtPath вместо copyItemAtPath. ошибка разрешения

Я попытался удалить файл с заполненной базой данных после копирования. ошибка разрешения

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

ответ

1

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

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

let alreadyExists = NSFileManager.defaultManager().fileExistsAtPath(defaultPath) 

if alreadyExists == false && let bundledPath = path { 
    print("use pre-populated database") 
    do { 
     try NSFileManager.defaultManager().removeItemAtPath(defaultPath) 
     try NSFileManager.defaultManager().copyItemAtPath(bundledPath, toPath: defaultPath) 

    } catch { 
     print("remove") 
     print(error) 
    } 
} 
+0

о, да, это было бы так. btw, это 'fileExistsAtPath' – Jesse

+0

@TiM Почему' файл существует' всегда возвращает true? – aaisataev

+0

@aaisataev После создания файла нет необходимости снова запускать тот же код замены. Поэтому имеет смысл, что он всегда будет возвращать «истину» после первого раза. :) – TiM

7

В Swift 3,0, попробуйте следующее:

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(fileManager.fileExists(atPath: destPath!)) 
    } else { 
     do { 
      //Copy file from bundle to Realm default path 
      try fileManager.copyItem(atPath: bundlePath!, toPath: destPath!) 
     } catch { 
      print("\n",error) 
     } 
    } 
+0

Вы уверены, что «Realm.Configuration.defaultConfiguration.fileURL ?.path» не изменится в будущих версиях царства? –

+0

Я не уверен, что это не будет изменяться в будущем, но сейчас это нормально (Realm 2.5.1) –

+0

@LuanVoThanh Почему 'файл существует' всегда возвращает true? – aaisataev

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