2015-12-23 1 views
0

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

class FeesPaid: Object { 
    dynamic var fileNumber = "" 
    dynamic var forMonth = "" 
    dynamic var amount: Float = 0.0 
    dynamic var balance: Float = 0.0 <------- 
    dynamic var date = "" 
} 

Я следовал инструкции на Realm.io и я скопировал код в первом блоке и поместил его в моем «приложениях (приложения: didFinishLaunchingWithOptions :)» функция, которая расположена в «AppDelegate.swift " файл.

let config = Realm.Configuration(
    // Set the new schema version. This must be greater than the previously used 
    // version (if you've never set a schema version before, the version is 0). 
    schemaVersion: 1, 

    // Set the block which will be called automatically when opening a Realm with 
    // a schema version lower than the one set above 
    migrationBlock: { migration, oldSchemaVersion in 
     // We haven’t migrated anything yet, so oldSchemaVersion == 0 
     if (oldSchemaVersion < 1) { 
      // Nothing to do! 
      // Realm will automatically detect new properties and removed properties 
      // And will update the schema on disk automatically 
     } 
    } 
) 

// Tell Realm to use this new configuration object for the default Realm 
Realm.Configuration.defaultConfiguration = config 

// Now that we've told Realm how to handle the schema change, opening the file 
// will automatically perform the migration 
let clients = try! Realm() 

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

Тем не менее, когда я запускаю мое приложение я получаю сообщение об ошибке:

 
fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=0 "Migration is required for object type 'FeesPaid' due to the following errors: 
- Property 'balance' has been added to latest object model." UserInfo={NSLocalizedDescription=Migration is required for object type 'FeesPaid' due to the following errors: 
- Property 'balance' has been added to latest object model.}: file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-700.1.101.15/src/swift/stdlib/public/core/ErrorType.swift, line 50 

Так что я делаю неправильно?

Мне не нужно перечислять или заполнять любые значения в новом поле. Мне просто нужно новое поле в моей схеме.

+0

Вы пытались установить схему на 2? Я предполагаю, что вы запустили приложение после установки schemaVersion в 1, но перед добавлением свойства в модель. Всякий раз, когда я получал эту ошибку раньше, я просто сталкиваюсь с schemaVersion и вычисляет миграцию. – esthepiking

+0

Я действительно. Я даже попытался сделать версию до 3, 4 и 5 без успеха. Есть ли что-то еще, что я должен делать? –

+0

Нет, это должно быть все. Если вы просто тестируете локально, вы можете удалить приложение и переустановить, что позаботится о проблеме миграции, но это не является хорошим решением для производственного приложения. – esthepiking

ответ

1

Я сравнивал ваш код с примерами в документах и ​​sample code, и это выглядит отлично. По всем счетам должен работать.

Единственное, что я могу придумать, это то, что объект может быть вызван в другом месте вашего приложения, прежде чем он будет настроен в вашем делете приложения. Это возможно, если в вашем приложении используются раскадровки, и у вас есть какой-либо код Realm в контроллере вида viewDidLoad, так как он загружается до запуска вашего делегата приложения. Если это так, то это довольно легко решить, поскольку все, что вам нужно сделать, это вручную настроить и представить свою раскадровку в конце application(application:didFinishLaunchingWithOptions:)

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

+0

TiM & esthepiking: В моей функции viewDidLoad был введен код Realm для первой сцены сценария. Этот код был связан с именованием файла .realm чем-то иным, чем «default». Я переместил этот код в приложение (приложение: didFinishLaunchingWithOptions :) как раз под секцией кода, выполняющего миграцию. После этого я смог выполнить миграцию. –

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