领域+ SwiftUI -更新架构版本

o4hqfura  于 2023-01-25  发布在  Swift
关注(0)|答案(2)|浏览(122)

我正在尝试更新Schema版本,以便可以添加性地更改Schema(只添加一个属性而不影响现有记录)。
我在加载主屏幕视图时运行了以下代码:

var configCheck = Realm.Configuration();
do {
    let fileUrlIs = try schemaVersionAtURL(configCheck.fileURL!)
    print("schema version \(fileUrlIs)")
} catch  {
    print(error)
}

架构版本为0。
然后,我将以下内容添加到onload函数中:

var config = Realm.Configuration.defaultConfiguration
config.schemaVersion = 2
let realm = try! Realm(configuration: config)
        
configCheck = Realm.Configuration();
do {
    let fileUrlIs = try schemaVersionAtURL(configCheck.fileURL!)
    print("schema version \(fileUrlIs)")
} catch  {
    print(error)
}

当我尝试写入数据库时,收到以下错误:
浏览次数:483次致命错误:"try!"表达式意外引发错误:Error Domain = io. realm Code = 1 "提供的架构版本0低于上次设置的版本2。" UserInfo = {NSLocalizedDescription =提供的架构版本0低于上次设置的版本2。,Error Code = 1}
2023 - 01 - 23 14:33:30.862303 + 0400应用程序名称[87285:5267261]实时雨燕/雨燕用户界面。雨燕:483:致命错误:"try!"表达式意外引发错误:Error Domain = io. realm Code = 1 "提供的架构版本0低于上次设置的版本2。" UserInfo = {NSLocalizedDescription =提供的架构版本0低于上次设置的版本2。,Error Code = 1}
我不确定这个错误意味着什么,因为我以为我已经更新了模式版本(现在运行原始代码显示模式版本2)。

k10s72fa

k10s72fa1#

虽然另一个答案是好的,但如果唯一的变化是附加的(如问题中所示),它可以大大简化
换句话说,如果存在现有的模型并且 * 添加了 * 一个属性,那么迁移就变成了三行代码。
例如,如果当前方案版本为4,并且向模型中添加了属性,则只需执行以下操作

let config = Realm.Configuration(schemaVersion: 5)
Realm.Configuration.defaultConfiguration = config
let realm = try! Realm()

如果您有AppDelegate,或者在需要Realm更新它之前的任何时候,都可以在AppDelegate中调用它。

7fhtutme

7fhtutme2#

我想通了。
创建一个新类RealmMigrator:

import Foundation
import RealmSwift

class RealmMigrator {
    init() {
        updateRealmSchema()
    }
    
    func updateRealmSchema() {
        var config = Realm.Configuration.defaultConfiguration
        config.schemaVersion = 2
        let realm = try! Realm(configuration: config)

        var configCheck = Realm.Configuration();
        
        Realm.Configuration.defaultConfiguration = config
        let _ = try! Realm()
        
        
        do {
             let fileUrlIs = try schemaVersionAtURL(configCheck.fileURL!)
            print("schema version \(fileUrlIs)")
        } catch  {
            print(error)
        }
    }
}

您也可以在这里执行更复杂的迁移操作,请参见this video for example on how to amend existing records
在应用程序入口点(名为[AppName]. swift)中,我在正文中添加了最后一行:

@main
struct AppName: App {
    var body: some Scene {
        let realmMigrator = RealmMigrator()

相关问题