0

レルム データベースを移行し、スキーマ バージョンを設定する、文書化された方法の 1 つを使用しようとしています。私が使用しているコードの種類は次のとおりです。

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

これはかなり標準的なコードのようで、他の人が使用しているようです。ただし、私をつまずかせているように見えるのは、レルムインスタンスを初期化しているところです。これにより、スキーマ設定が設定または永続化されません。

私が苦労しているのは、次のコードをどこに設定するかです:

let uiRealm = try! Realm()
  • これを @UIApplicationMain の上の AppDelegate の上部に配置すると、初期化が早すぎます
  • 移行後に関数を呼び出す予定のコントローラーファイルを作成し、その先頭にイニシャライザーを配置すると、まだ機能しません
  • 以下のコードのように ViewController のクラス内に配置すると、エラー Instance member uiRealm cannot be used on type XYZViewController が表示されます

    import UIKit
    import RealmSwift
    
    class XYZViewController: UITableViewController,UIPickerViewDataSource,UIPickerViewDelegate {
    
        let uiRealm = try! Realm()
        var scenarios = uiRealm.objects(Scenario).filter("isActive = true ")
    
    }
    

だから私の質問は、どこで初期化するか、どのように移行するのが最善かについてのベストプラクティスはありますか?

4

1 に答える 1

1

Configurationコードの他の部分で呼び出しを行う前に、レルムのデフォルト設定としてオブジェクトを設定したことを確認する必要がありますRealm()

ベスト プラクティスはRealm()、よほどの理由がない限り、 への参照を保持しないことです。を呼び出すたびにRealm()、以前にキャッシュされたオブジェクトのインスタンスが返されるため、インスタンスへの参照を作成し、アプリのライフサイクルのためにそのインスタンスにぶら下がっても、パフォーマンス上の利点はありません。

オブジェクトに移行情報を設定するのに最適な場所Configurationは、できるだけ早く、コードが を呼び出す機会を得る前Realm()です。そのため、アプリ デリゲートはこれに適した場所です。

Realm()すでに事前設定されていることに依存しているクラス プロパティがある場合はlazy、これらのプロパティの先頭にキーワードを追加すると、実際に必要になるまで作成を遅らせることができる場合があります。

于 2016-10-03T17:51:36.053 に答える