【发布时间】:2017-02-14 18:57:11
【问题描述】:
我是 Realm 的新手,我想在我的应用程序中发送一个预捆绑的 Realm 文件,但是我不清楚 realm documentation 如何实际创建一个 .realm 文件并将所需的预捆绑数据上传到它。我无法通过 SO、Google 或 Youtube 找到任何解决方案。分步说明会很有帮助。
【问题讨论】:
我是 Realm 的新手,我想在我的应用程序中发送一个预捆绑的 Realm 文件,但是我不清楚 realm documentation 如何实际创建一个 .realm 文件并将所需的预捆绑数据上传到它。我无法通过 SO、Google 或 Youtube 找到任何解决方案。分步说明会很有帮助。
【问题讨论】:
我们仍在寻找正式使生成预填充领域更容易的方法。这绝对是 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文件,然后输入一组Array和Dictionary对象的非持久化Realm对象Object创建的实例每次运行测试。然后在控制台中打印最终 Realm 的位置,以便我可以抓取它并将其移动到应用程序包中。
【讨论】:
Realm().writeCopy.(toFile: _ ,encryptionKey:),但我的文件路径非常长,我收到一条错误消息,说我不能为我的路径添加字符串。一些建议将不胜感激。 @TiM
Documents 很好,如果你不在 iTunes 中公开它,Application Support 很好,否则很好。 :)