如何创建预捆绑的域文件并将数据上传到它?

时间:2017-02-14 18:57:11

标签: ios swift database realm

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

1 个答案:

答案 0 :(得分:4)

我们仍在寻找正式制作预先填充的Realms的方法。它绝对是Realm Browser的理想功能,但由于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文件,然后输入一组非持久Realm的ArrayDictionary个对象{ {1}}每次运行测试时创建的实例。然后在控制台中打印最终Realm的位置,这样我就可以抓住它并将其移动到应用程序包中。