【问题标题】:How to create a pre bundled realm file and upload data to it?如何创建预先捆绑的领域文件并将数据上传到其中?
【发布时间】:2017-02-14 18:57:11
【问题描述】:

我是 Realm 的新手,我想在我的应用程序中发送一个预捆绑的 Realm 文件,但是我不清楚 realm documentation 如何实际创建一个 .realm 文件并将所需的预捆绑数据上传到它。我无法通过 SO、Google 或 Youtube 找到任何解决方案。分步说明会很有帮助。

【问题讨论】:

    标签: ios swift database realm


    【解决方案1】:

    我们仍在寻找正式使生成预填充领域更容易的方法。这绝对是 Realm 浏览器所需要的功能,但由于 Realm 文件在更改架构时需要迁移的方式,将其合并到 UI 中有些棘手。这绝对是我们想要改进的地方。

    目前,浏览器有a converter in it,可以像CSV文件一样执行最少的数据导入。

    Realm 文档说,为您的应用程序需求生成预填充 Realm 的最简单方法是构建一个单独的 macOS 应用程序,其唯一作用是生成 Realm 文件,预填充数据,然后公开生成的 Realm 文件,以便您可以将其复制到您的应用程序中。

    执行此操作的操作就像任何正常的 Realm 交互(try! Realm() 是导致文件实际最初创建的原因),除了您在完成后手动与磁盘上的 Realm 文件交互。

    我正在为 iOS 会议开发一个应用程序,该活动的日程安排数据将存储在一个 Realm 中,该应用程序在发布时与该应用程序预先捆绑在一起。

    因为我认为创建一个额外的 macOS 应用程序对于 iOS 应用程序来说太过分了,所以我改为使用 iOS 单元测试,它会在每次执行时从头开始生成预先捆绑的 Realm。

    class Tests: XCTestCase {
        func testGenerateNewDefaultRealm() {
            let sources = [conferences, sponsors, conferenceDays] as [Any]
            XCTAssert(generateDefaultRealm(named: "MyConferenceRealm.realm", sources: sources))
        }
    }
    
    extension Tests {
        public func generateDefaultRealm(named name: String, sources: [Any]) -> Bool {
            // Create and configure the Realm file we'll be writing to
            let realm = generateRealm(named: name)
    
            // Open a Realm write transaction
            realm.beginWrite()
    
            // Loop through each source and add it to Realm
            for source in sources {
                if let objectArray = source as? [Object] {
                    for object in objectArray {
                        realm.add(object)
                    }
                }
                else if let objectDictionary = source as? [String : Object] {
                    for (_, object) in objectDictionary {
                        realm.add(object)
                    }
                }
            }
    
            // Commit the write transaction
            do {
                try realm.commitWrite()
            }
            catch let error {
                print(error.localizedDescription)
                return false
            }
    
            // Print the file location of the generated Realm
            print("=====================================================================")
            print(" ")
            print("Successfully generated at")
            print(realm.configuration.fileURL!.path)
            print(" ")
            print("=====================================================================")
    
            return true
        }
    
        public func generateRealm(named name: String) -> Realm {
            let exportPath = NSTemporaryDirectory()
            let realmPath = exportPath.appending(name)
    
            // Delete previous Realm file
            if FileManager.default.fileExists(atPath: realmPath) {
                try! FileManager.default.removeItem(atPath: realmPath)
            }
    
            // Create new Realm file at path
            let objectTypes: [Object.Type] = [Conference.self, ConferenceDay.self, SessionBlock.self, Event.self, Presentation.self,
                                              Session.self, Location.self, Speaker.self, Sponsor.self, Venue.self]
            let configuration = Realm.Configuration(fileURL: URL(string: realmPath), objectTypes: objectTypes)
            let realm = try! Realm(configuration: configuration)
            return realm
        }
    }
    

    运行这个单元测试将在Mac的NSTemporaryDirectory()目录中生成一个新的Realm文件,然后输入一组ArrayDictionary对象的非持久化Realm对象Object创建的实例每次运行测试。然后在控制台中打印最终 Realm 的位置,以便我可以抓取它并将其移动到应用程序包中。

    【讨论】:

    • 感谢您的回复。我有一个查询多个集合的 Parse 数据库,我目前有一个方法可以一次运行所有查询(当用户登录时)是否可以将来自不同集合的数据放在同一个 .realm 文件中?如果是这样,我将如何从我的方法中提取数据并将其保存到文件中?另外 XCTAssert 指的是什么? @TiM
    • 别担心!如果这回答了您的问题,请记住接受它。 :) 是的!这应该是可能的。我猜 Parse 只是在查询完成时在您的应用程序中调用本地方法。那时,您只需像往常一样通过写入事务将数据复制到 Realm。如果您要写入预先捆绑的领域,您必须将其复制到您的应用程序中允许您写入数据的部分。很可能是 Documents 目录。
    • 我能够创建一个捆绑的领域文件,但是它很大(68 GB),我想压缩它以便将它添加到我的项目中。解决此问题的最佳方法是什么?在文档中,它说要使用Realm().writeCopy.(toFile: _ ,encryptionKey:),但我的文件路径非常长,我收到一条错误消息,说我不能为我的路径添加字符串。一些建议将不胜感激。 @TiM
    • 我的领域文件也已经在 Documents 文件夹中,但是当我试图从中读取时,我收到一个错误 fatal error: unexpectedly found nil while unwrapping an Optional value 所以我似乎没有访问该文件。如何确保我正在访问该文件? @TiM
    • 啊!很高兴听到! 1.3MB 更易于管理。 :) 如果您只需要从中读取,您可以将它留在您的应用程序包中。但是,是的,如果您想写入它,您需要将它移动到您的应用程序中具有写入权限的部分。 Documents 很好,如果你不在 iTunes 中公开它,Application Support 很好,否则很好。 :)
    猜你喜欢
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    相关资源
    最近更新 更多