我是Realm的新手,我想发送一个预先捆绑的Realm文件我的应用程序,但realm documentation我不清楚如何实际创建一个.realm文件,并上传所需的预捆绑数据到它。我无法通过SO,Google或Youtube找到任何解决方案。分步说明非常有用。
答案 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的Array
和Dictionary
个对象{ {1}}每次运行测试时创建的实例。然后在控制台中打印最终Realm的位置,这样我就可以抓住它并将其移动到应用程序包中。