web-dev-qa-db-ja.com

レルム-初期データを含むファイルをプロジェクトに追加します(iOS / Swift)

Swiftを使用してiOS用のアプリケーションを開発しており、そのデータベースソリューションとしてレルムを選択しました。レルムドキュメントの書き込み/追加機能を使用してAppDelegateにデフォルトのデータを書き込んだので、問題なく動作します。最初の起動後、初期データを含む* .realmファイルがあります。レルムのドキュメントで、 "レルムとアプリのバンドル" というセクションを見つけました。*。realmファイルをプロジェクトに追加し、記述どおりにフェーズを構築します。

そして、次に何をすべきか(そして* .realmファイルの圧縮についての部分)を理解できません。 移行例 のコードを理解しようとしましたが、Obj-Cについてはよくわかりません。

初期データを含む* .realmファイルをSwift iosプロジェクトに追加し、最初の起動時にこのデータをレルムデータベースにロードするために、できるだけ明確な手順を実行してください。

16
Max

この関数openRealmをAppDelegateに実装し、で呼び出します

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

アプリにバンドルしたレルムファイルがまだ存在しない場合は、デフォルトのレルムパスにコピーされます。その後、以前と同じように通常どおりレルムを使用します。

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

(ただし、オプションには注意してください)

22
pteofil

そして、Objective-cで@pteofilの答えが必要な人のために

- (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];
    }
}
3
ninjaneer

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

@pteofilのopenRealm関数をSwift 2.2/Realm 1.0.2:

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 {}
        }

}
1
alias235

バンドルの場所から直接開き、デフォルトのレルムパスにコピーする必要がない場合は、実装を確認してください ここ

0
Harry Bloom

エンタープライズスペースで作業する場合、すべてのアプリケーションでレルムを再利用せずに各アプリケーションのレルムを開く必要があるため、これを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」のレルムを開くか作成します。

場所

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()
0
mac

システムにRealmStudioをダウンロードします。次に、Xcodeからパスを出力してコピーします。

print(Realm.Configuration.defaultConfiguration.fileURL!)

次に、ターミナルを開いて次のように記述します。

open //file path

Realm Studioでファイルが開き、そこでモデルデータを確認できます。

0
Sush Mit