Realm – 将具有初始数据的文件添加到项目(iOS / Swift)

我正在使用swift为iOS开发应用程序,并selectRealm作为它的数据库解决scheme。 我在AppDelegate中使用来自领域文档的写入/添加function编写了默认数据,它工作得很好。 所以首次启动后,我有一个* .realm文件与我的初始数据。 在Realm的文档中,我find了一个名为“捆绑领域与应用程序”的部分 ,我添加了我的* .realm文件来编写项目和构build阶段。

而且我不明白接下来应该怎么做(关于压缩* .realm文件的一部分)。 我试图从迁移示例中了解代码,但是我不太了解Obj-C。

请给出清晰的步骤,以便将具有初始数据的* .realm文件添加到swift ios项目,并在首次启动时将此数据加载到Realm数据库。

在AppDelegate中实现这个函数openRealm并调用它

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { ... openRealm() return true } func openRealm() { let defaultRealmPath = Realm.defaultPath let bundleReamPath = NSBundle.mainBundle().resourcePath?.stringByAppendingPathComponent("default.realm") if !NSFileManager.defaultManager().fileExistsAtPath(defaultRealmPath) { NSFileManager.defaultManager().copyItemAtPath(bundleReamPath!, toPath: defaultRealmPath, error: nil) } } 

它会将您在应用程序中捆绑的领域文件复制到默认领域path(如果它不存在)。 之后,你通常像以前一样使用Realm。

还有你在Swift中谈到的Migration例子。

在Swift 3.0.1中,你可能更喜欢这样的:

  let defaultRealmPath = Realm.Configuration.defaultConfiguration.fileURL! let bundleRealmPath = Bundle.main.url(forResource: "seeds", withExtension: "realm") if !FileManager.default.fileExists(atPath: defaultRealmPath.absoluteString) { do { try FileManager.default.copyItem(at: bundleRealmPath!, to: defaultRealmPath) } catch let error { print("error copying seeds: \(error)") } } 

(但请谨慎select)

对于需要@Pteofil在Objective-c中的答案

 - (void)openRealm { NSString *defaultRealmPath = [RLMRealm defaultRealm].path; NSString *bundleRealmPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"default.realm"]; if(![[NSFileManager defaultManager] fileExistsAtPath:defaultRealmPath]) { [[NSFileManager defaultManager] copyItemAtPath:bundleRealmPath toPath:defaultRealmPath error:nil]; } } 

Swift版本3, Kishikawa Katsumi提供 :

 let defaultRealmPath = Realm.Configuration.defaultConfiguration.fileURL! let bundleReamPath = Bundle.main.path(forResource: "default", ofType:"realm") if !FileManager.default.fileExists(atPath: defaultRealmPath.path) { do { try FileManager.default.copyItem(atPath: bundleReamPath!, toPath: defaultRealmPath.path) } catch let error as NSError { // Catch fires here, with an NSError being thrown print("error occurred, here are the details:\n \(error)") } } 

为Swift 2.2 / Realm 1.0.2更新@ pteofil的openRealm函数:

 func openRealm() { let defaultURL = Realm.Configuration.defaultConfiguration.fileURL! let bundleReamPath = NSBundle.mainBundle().URLForResource("default", withExtension: "realm") if !NSFileManager.defaultManager().fileExistsAtPath(defaultURL.path!) { do { try NSFileManager.defaultManager().copyItemAtURL(bundleReamPath!, toURL: defaultURL) } catch {} } } 

在企业领域工作,我需要为每个应用程序打开一个Realm,而不用在所有的应用程序中重复使用Realm,所以我把它们放在一起用于Swift 3.0。 将此函数添加到AppDelegate。

 func openRealm() { let appName = "ApplcationNameGoesHere" var rlmConfig = Realm.Configuration() let defaultRealmPath = Realm.Configuration.defaultConfiguration.fileURL! let appRealmPath = defaultRealmPath.deletingLastPathComponent().appendingPathComponent("\(appName).realm") if !FileManager.default.fileExists(atPath: appRealmPath.path) { // Use the default directory, but replace the filename with the application name: appName rlmConfig.fileURL = rlmConfig.fileURL!.deletingLastPathComponent().appendingPathComponent("\(appName).realm") }else { rlmConfig.fileURL = appRealmPath } // Set this as the configuration used for the default Realm Realm.Configuration.defaultConfiguration = rlmConfig }// open the Realm database for the application 

上面的代码打开或创build了一个名为“ApplicationNameGoesHere.realm”的Realm,该示例基于appNamevariables。

地点

 openRealm() before return true in application: didFinishLaunchingWithOptions func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. openRealm() return true 

}

在另一个类中调用它:

 let uiRealm = try! Realm()