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

Realm - Add file with initial data to project (iOS/Swift)

我正在使用 swift 为 iOS 开发一个应用程序,并选择 Realm 作为它的数据库解决方案。我使用领域文档中的 write/add 函数在 AppDelegate 中编写了默认数据,它工作得很好。所以在第一次启动后,我有一个包含我的初始数据的 *.realm 文件。在 Realm 文档中,我找到了一个名为 "Bundling a Realm with an App" 的部分,我将我的 *.realm 文件添加到项目中,并按其编写的方式添加到构建阶段。

而且我不明白我接下来应该做什么(以及关于压缩 *.realm 文件的部分)。我试图理解来自 Migration Example 的代码,但我不太了解 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)
    }
}

它会将您捆绑在应用程序中的领域文件复制到默认领域路径(如果尚不存在)。之后你就可以正常使用Realm了。

还有您在 Swift 中谈到的迁移示例。

在 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)")
        }
    }

(但请注意选项)

对于那些需要@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 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 {}
        }

}

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)")
}
}

在企业工作 space,我需要为每个应用程序打开一个 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

以上代码根据本例中的 appName 变量打开或创建文件名为 "ApplicationNameGoesHere.realm" 的 Realm。

地方

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

}

在另一个 class 中这样调用它:

let uiRealm = try! Realm()

如果您想直接从包位置打开它而不是将其复制到默认的 Realm 路径,请查看实现 here

在您的系统中下载 Realm Studio。然后从Xcode打印路径并复制:

print(Realm.Configuration.defaultConfiguration.fileURL!)

然后打开终端并写入:

open //file path

它将在 Realm Studio 中打开文件,您可以在那里看到您的模型数据。