28888


現在アプリに、普段はローカル（Realm）に保存されているデータをDropboxでバックアップできる機能をつけようと思っています。アップロードするためにはまずはドキュメントフォルダにある`default.realm`へのアクセスが必要かと思い、以下のコードを記述しているのですがエラーが発生します。どうすればエラーが出ずに、`default.realm`の情報が取得できるか教えていただけないでしょうか。

[code]

    if let dir : NSString = NSSearchPathForDirectoriesInDomains( NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true ).first {
        let path_file_name = dir.stringByAppendingPathComponent(file_name)
    
        print(dir)
        print(path_file_name)
    
        do {
            let uplorddata = try NSString( contentsOfFile: path_file_name, encoding: NSUTF8StringEncoding )
            print(uplorddata)
        } catch {
            //エラー処理
            print("エラー")
        }
    }
    
[/code]


CC BY-SA 3.0
2016-09-14T16:17:30.887
28887
2016-09-14T18:26:44.567
2016-09-14T18:05:55.147
5519
18791
question
swift realm
Documentsディレクトリにあるdefault.realmについて


Realmのファイルはテキストファイルではないので、`NSString(contentsOfFile:encoding:)`で読むことはできません。

[Dropboxのドキュメント](https://www.dropbox.com/developers/documentation/swift#documentation)によると、ファイルのアップロードは下記のように、NSDataを`upload(path:input:)`メソッドの`input`パラメータに渡せばいいようなので、NSDataとして読む必要があると思います。

[code]

    // Upload a file
    let fileData = "Hello!".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
    client.files.upload(path: "/hello.txt", input: fileData!).response { response, error in
    ...
    
[/code]

指定したファイルパスのファイルをNSDataとして読み込むには、例えば`NSData(contentsOfFile:options:)`を使って下記のようにします。

[code]

    do {
        let uplorddata = try NSData(contentsOfFile: path_file_name, options: [])
    
[/code]

また、デフォルトのRealmの保存先は`Realm.Configuration.defaultConfiguration.fileURL`で取得できますので、パスを組み立てる必要はありません。

`try〜catch`ではエラーオブジェクトを取得するようにしたほうが何でエラーになったのかがわかって便利です。

ここまでをまとめると、下記のように修正できます。

[code]

    if let realmFileURL = Realm.Configuration.defaultConfiguration.fileURL {
        print(realmFileURL)
        do {
            let uplorddata = try NSData(contentsOfURL: realmFileURL, options: [])
            print(uplorddata)
        } catch let error as NSError {
            print(error)
        }
    }
    
[/code]


CC BY-SA 3.0
2016-09-14T18:26:44.567
28888
2016-09-14T18:26:44.567
5519
28887
answer