删除数据而不是使用迁移

Posted

技术标签:

【中文标题】删除数据而不是使用迁移【英文标题】:Deleting Data instead of using Migration 【发布时间】:2017-05-16 05:48:26 【问题描述】:

在我的代码中,我向我的领域类添加了一个属性。有没有办法删除数据并摆脱我的整个数据库而不是使用迁移?

我仍在测试这就是为什么我现在可能不需要迁移。

请帮帮我,我在使用 Migration 时真的很吃力

谢谢

【问题讨论】:

【参考方案1】:

见Realm.Configuration.deleteRealmIfMigrationNeeded。

【讨论】:

【参考方案2】:

如果您只是在本地进行测试,您可以删除该应用并重新安装。如果您已经在 App Store 上拥有您的应用并希望为用户准备迁移,您可以查看来自 Realm 的Migrations Sample App。

在你的 AppDelegate 上试试这个:

import UIKit
import RealmSwift

// Old data models
/* V0
class Person: Object 
    dynamic var firstName = ""
    dynamic var lastName = ""
    dynamic var age = 0

*/

// V1
class Person: Object 
    dynamic var fullName = ""        // combine firstName and lastName into single field
    dynamic var age = 0



class Person: Object 
    dynamic var fullName = ""
    dynamic var age = 0


func bundleURL(_ name: String) -> URL? 
    return Bundle.main.url(forResource: name, withExtension: "realm")


@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate 

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool 
        window = UIWindow(frame: UIScreen.main.bounds)
        window?.rootViewController = UIViewController()
        window?.makeKeyAndVisible()

        // copy over old data files for migration
        let defaultURL = Realm.Configuration.defaultConfiguration.fileURL!
        let defaultParentURL = defaultURL.deletingLastPathComponent()

        if let v0URL = bundleURL("default-v0") 
            do 
                try FileManager.default.removeItem(at: defaultURL)
                try FileManager.default.copyItem(at: v0URL, to: defaultURL)
             catch 
        

        // define a migration block
        // you can define this inline, but we will reuse this to migrate realm files from multiple versions
        // to the most current version of our data model
        let migrationBlock: MigrationBlock =  migration, oldSchemaVersion in
            if oldSchemaVersion < 1 
                migration.enumerateObjects(ofType: Person.className())  oldObject, newObject in
                    if oldSchemaVersion < 1 
                        // combine name fields into a single field
                        let firstName = oldObject!["firstName"] as! String
                        let lastName = oldObject!["lastName"] as! String
                        newObject?["fullName"] = "\(firstName) \(lastName)"
                    
                
            
            print("Migration complete.")
        

        Realm.Configuration.defaultConfiguration = Realm.Configuration(schemaVersion: 2, migrationBlock: migrationBlock)

        // print out all migrated objects in the default realm
        // migration is performed implicitly on Realm access
        print("Migrated objects in the default Realm: \(try! Realm().objects(Person.self))")

        return true
    

【讨论】:

非常感谢,这对我很有帮助

以上是关于删除数据而不是使用迁移的主要内容,如果未能解决你的问题,请参考以下文章

如何删除种子而不会对数据库产生任何影响?

数据库更新后是不是可以删除 EF Core 数据库迁移

核心数据迁移:除了少数特定对象之外,是不是可以删除旧存储?

核心数据迁移是不是必要?

从迁移中生成 SQL 而无需全部删除

迁移到现有数据库而不匹配迁移