23105


swiftで日記アプリを作っています。

実現したいことは、ローカルデータベースrealmのデータファイル（default.realm）をdropboxにバックアップし、復元することです。

ユーザーがアプリを消してしまい、再ダウンロードした状態でDropboxにログインした際に、Dropboxに保存しておいたdefault.realmをdefaults.realmという名前でダウンロードし、default.realm（未ログイン時のデータ）を1件づつdefaults.realmにコピー。元のdefault.realmを削除し、defaults.realmをdefault.realmにリネームするという形でファイルを復元するところまでを実装しました。

しかし、復元した新しいdefault.realmからデータを取りだしたいのですが、元々のdefault.realm（未ログイン時のデータ）からデータを取り出す形になってしまいます。以下がdefaults.realm→default.realmへのリネーム、realmからデータを取り出す部分のコードです。

[code]

     if NSFileManager.defaultManager().fileExistsAtPath("\(documentDirPath)/\(fileName)") && NSFileManager.defaultManager().fileExistsAtPath("\(documentDirPath)/\(fileNames)"){
    
                        try!NSFileManager.defaultManager().removeItemAtPath("\(documentDirPath)/\(fileNames)")
                        try!NSFileManager.defaultManager().moveItemAtPath("\(documentDirPath)/\(fileName)", toPath: "\(documentDirPath)/\(fileNames)")
    
                    }
    
    
                    let realms = try!Realm()
                    let Photo = realms.objects(Photos)
                    print("写真１\(Photo)")
                    for photo in Photo{
    
                        let filename = photo.filename
                        if let client = Dropbox.authorizedClient{
    
                            client.files.download(path: "/\(filename)", destination: destination).response({ (response, error) -> Void in
    
                                if let metadata = response{
                                    print("download \(metadata)")
                                }else{
                                    print(error)
                                }
    
                            })
    
                        }
    
                    }
    
[/code]

一度アプリを閉じてからビルドすると復元した新しいdefault.realmが反映されます。

どうすれば、realmファイルのコピー、リネームが完了した流れで、新しいファイルを反映することができるのでしょうか。よろしくお願いします。


CC BY-SA 3.0
2016-03-12T15:13:29.553
23066
2016-03-14T01:38:20.490
2016-03-13T12:21:37.053
10791
10791
question
swift realm swift2
リネームしたdefault.realmを読み込み、表示したい


同じファイル名のRealmファイルを上書きして、実行中に切り替えるには、ファイルを上書きする前に、全てのスレッドで、そのファイルを参照するRealmインスタンスが全て解放されている必要があります。  
そうでなければ、以前のRealmファイルのデータがメモリやキャッシュに残っているので、書かれたような現象、アプリを再起動するとファイルが切り替わる（ように見える）が起こります。

やりたいことを実現する簡単な方法は別のファイル名にして切り替えることです。  
（全てのスレッドでRealmの参照が解放されていることを保証するのは難しいので）

例えば、未ログイン時のデータを「local.realm」、サーバ（DropBox）からダウンロードしたデータを「server.realm」とし、２つをマージしたデータを「merged.realm」とします。

そうすると、未ログイン時は「local.realm」を使い、ログイン後に「server.realm」をダウンロード、データをどちらかにマージして、「merged.realm」としてコピー。  
その後、「merged.realm」を新しく読み込む、とすれば簡単にデータの移行ができます。

もし、同じファイル名でやりたい場合は、切り替えの間は別スレッドでRealmを使わないようにして、切り替える前と後でRealmのインスタンスを`autoreleasepool`ブロックで囲い、それぞれのRealmインスタンスが解放されるようにします。

[code]

    autoreleasepool {
        let realm = try! Realm()
        // データをマージ
        // ファイル名を変更など
    }
    
    autoreleasepool {
        // 新しいファイルを読み込む
        let realm = try! Realm()
    }
    
[/code]


CC BY-SA 3.0
2016-03-14T01:38:20.490
23105
2016-03-14T01:38:20.490
5519
23066
answer