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/
何か案は?
ローカル開発のみである限り、移行を行う代わりに、レルムデータベースをリセットすることをお勧めします。アプリのバージョンを別のスキーマですでに出荷していて、ユーザーデータを保持したい場合は、移行が適しています。
シミュレーターまたはデバイスからアプリを削除することにより、データベースを削除できます。または、データベースにアクセスする前に NSFileManager
を使用してRealmファイルを削除することもできます。
let defaultPath = Realm.Configuration.defaultConfiguration.path!
try NSFileManager.defaultManager().removeItemAtPath(defaultPath)
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
}
}
代わりに、それを必要とする関数内にオブジェクトを作成しました。これはとにかくより良いアプローチです。
移行設定がapplication(application:didFinishLaunchingWithOptions:)
に設定される前に、Realm()のインスタンスをインスタンス化しないでください。クラッシュしたら、実行スタックをチェックして、どのインスタンスが例外を発生させたかを確認します。同じエラーが発生しました。私の場合、いずれかのビューコントローラーのRealmインスタンスが、移行ブロックが設定される前にインスタンス化されました。
幸運を
IPhoneからアプリを削除して、もう一度インストールします。うまくいきます。
私もしばしば同じ致命的なエラーを受け取ります。これは通常、「主キー」でレルムオブジェクトを変更したときに発生します。最も迅速で簡単な修正は、デバイスまたはシミュレーターからアプリを削除してから、プロジェクトを再度実行することです。
SchemaVersionを適切に更新しましたか?変更を加える前にschemaVersion: 1
を設定した場合は、移行をトリガーするために2
に変更する必要があります。
私は最良の解決策を見つけます:
didFinishLaunchingWithOptions
のwillFinishLaunchingWithOptions
の前にレルム移行コードを追加する必要があります
func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
RealmManager.shared.configureRealm()
return true
}