web-dev-qa-db-ja.com

レルムの移行が機能しない

    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 realm = try! Realm()

これはapplication(application:didFinishLaunchingWithOptions :)に入れられました

テストプログラムでは、オブジェクトのフィールドを変更しました。データベース内のすべてを削除して、新しいフィールドタイプに移動したいと思います。上記のコードをドキュメントからコピーしましたが、何もしないようです。私はまだこれらのエラーを受け取ります:

fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=0 "Migration is required due to the following errors: 
- Property types for 'unit' property do not match. Old type 'string', new type 'int'
- Property 'reps' has been added to latest object model." UserInfo={NSLocalizedDescription=Migration is required due to the following errors: 
- Property types for 'unit' property do not match. Old type 'string', new type 'int'
- Property 'reps' 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/

何か案は?

14
user2179936

ローカル開発のみである限り、移行を行う代わりに、レルムデータベースをリセットすることをお勧めします。アプリのバージョンを別のスキーマですでに出荷していて、ユーザーデータを保持したい場合は、移行が適しています。

シミュレーターまたはデバイスからアプリを削除することにより、データベースを削除できます。または、データベースにアクセスする前に NSFileManager を使用してRealmファイルを削除することもできます。

let defaultPath = Realm.Configuration.defaultConfiguration.path!
try NSFileManager.defaultManager().removeItemAtPath(defaultPath)
2
marius

didFinishLaunchingWithOptionsにデフォルトの移行コードを追加したにもかかわらず、アプリがクラッシュする同様の問題が発生しました

問題は、実際にfirstビューコントローラーでRealmのインスタンスをクラスレベルのプロパティとして初期化していたことです。したがって、最初のViewControllerからそのクラスレベルのレルムオブジェクトを削除すると、問題が修正されました。

import UIKit
import RealmSwift

class ViewController: UIViewController{
  let db = try! Realm() // Removing this solved my issue

  func doSomething(){
    let db = try! Realm() // Placed this here instead
  }
}

代わりに、それを必要とする関数内にオブジェクトを作成しました。これはとにかくより良いアプローチです。

14
Geoherna

移行設定がapplication(application:didFinishLaunchingWithOptions:)に設定される前に、Realm()のインスタンスをインスタンス化しないでください。クラッシュしたら、実行スタックをチェックして、どのインスタンスが例外を発生させたかを確認します。同じエラーが発生しました。私の場合、いずれかのビューコントローラーのRealmインスタンスが、移行ブロックが設定される前にインスタンス化されました。

幸運を

3
Digitech

IPhoneからアプリを削除して、もう一度インストールします。うまくいきます。

2
reza_khalafi

私もしばしば同じ致命的なエラーを受け取ります。これは通常、「主キー」でレルムオブジェクトを変更したときに発生します。最も迅速で簡単な修正は、デバイスまたはシミュレーターからアプリを削除してから、プロジェクトを再度実行することです。

2
Mo Iisa

SchemaVersionを適切に更新しましたか?変更を加える前にschemaVersion: 1を設定した場合は、移行をトリガーするために2に変更する必要があります。

1
arsenius

私は最良の解決策を見つけます:

didFinishLaunchingWithOptionswillFinishLaunchingWithOptionsの前にレルム移行コードを追加する必要があります

func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {

    RealmManager.shared.configureRealm()

    return true
}
1
Zhanserik