2016-01-12 73 views
3

我正在嘗試使用捆綁的領域文件而沒有成功。我知道我的領域文件已成功複製到我的應用程序的目錄中,但我無法讀取它。無法在路徑上打開領域

fatal error: 'try!' expression unexpectedly raised an error: "Unable to open a realm at path '/Users/…/Library/Developer/CoreSimulator/Devices/…/data/Containers/Data/Application/…/Documents/default-v1.realm'. Please use a path where your app has read-write permissions."

func fullPathToFileInAppDocumentsDir(fileName: String) -> String { 

     let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,NSSearchPathDomainMask.UserDomainMask,true) 

     let documentsDirectory = paths[0] as NSString 

     let fullPathToTheFile = documentsDirectory.stringByAppendingPathComponent(fileName) 

     return fullPathToTheFile 
    } 

didFinishLaunchingWithOptions

let fileInDocuments = fullPathToFileInAppDocumentsDir("default-v1.realm") 

     if !NSFileManager.defaultManager().fileExistsAtPath(fileInDocuments) { 

      let bundle = NSBundle.mainBundle() 

      let fileInBundle = bundle.pathForResource("default-v1", ofType: "realm") 

      let fileManager = NSFileManager.defaultManager() 

      do { 
       try fileManager.copyItemAtPath(fileInBundle!, toPath: fileInDocuments) 
      } catch { print(error) } 
     } 

和設置配置用於默認域:

var config = Realm.Configuration() 
config.path = fileInDocuments 

Realm.Configuration.defaultConfiguration = config 

let realm = try! Realm(configuration: config) // It fails here!!! :-) 

由於文檔建議,我曾嘗試和打開它直接從束路徑設置readOnlytrueRealm.Configuration對象。我不確定這是否與Realm有關,或者我是否忽略了文件系統的某些內容......。我也嘗試將文件存儲在庫文件夾中。

Realm 0.97.0 
Xcode Version 7.1.1 
+0

任何運氣嗎?我遇到了同樣的問題 –

+0

@AndréCytryn,將文件權限更改爲讀/寫操作對我來說是個竅門:-)另外兩個答案也是值得您嘗試的有價值的東西。 – Fabio

回答

0

我試圖使用Realm的瀏覽器應用程序打開領域文件,該文件不再打開。它現在具有新的權限:Write only (Dropbox)。因此,我決定使用文件管理器的setAttributes方法將文件權限更改回read/write。以下是我如何做到的:

// rw rw r : Attention for octal-literal in Swift "0o". 
let permission = NSNumber(short: 0o664) 

    do { 
    try fileManager.setAttributes([NSFilePosixPermissions:permission], ofItemAtPath: fileInDocuments) 

    } catch { print(error) } 

現在可以在此路徑中打開領域文件。

0

每當一個較低水平的I/O操作被拒絕許可,您所指定的文件,該文件被異常拋出(你可以check it out上境界的GitHub的賬戶)。

即使您的示例代碼中的所有內容都看起來正確,但必須使用文件位置(無論是您的包的Realm文件的文件路徑還是目標路徑)錯誤地設置某些內容導致該錯誤。

我可以推薦嘗試一些東西。

  • 通過斷點/日誌記錄,人工仔細檢查這兩個fileInDocumentsfileInBundle被正確創建,在您所期望的位置指向。

  • 當在模擬器中運行應用程序時,使用工具SimPholders來跟蹤您計算機上應用程序的Documents目錄,並可視化地確保將Realm文件正確地複製到您所期望的位置。

  • 如果Realm文件位於正確的位置,您也可以Realm的Browser app嘗試打開Realm文件以確保文件已正確複製並仍能正常打開。

  • 請嘗試在適當的iOS設備上測試代碼,以查看本機系統上是否發生了相同的錯誤。

  • 如果一切都失敗,嘗試做與默認的Realm一些領域的操作(這將只是一個存放文件default.realm在Documents目錄中),只是爲了完全打折沒有什麼不對您的文件系統

讓我知道你如何去,如果你仍然無法解決問題,我們可以繼續尋找。 :)

+0

關於您的第三個建議,領域文件位於正確的位置,但無法打開。它現在具有新的權限:只寫(Dropbox)。所以,我決定使用文件管理器的setAttributes將文件權限更改回讀/寫。領域現在可以在此路徑打開:-)我應該添加自己的這個答案嗎? – Fabio

+1

啊,那就解釋一下吧!做得很好!是啊!我建議添加它作爲一個單獨的答案,幷包括您編寫的代碼來修復它。這是有價值的信息! :) – TiM

0

要根據我發現的內容添加到解決方案中,請記下Realm在拋出異常時報告的錯誤以及傳遞的錯誤類型。

在截稿時,此境界文檔他們的錯誤: https://realm.io/docs/objc/latest/api/Enums/RLMError.html

這意味着,你可以看看你的境界文件有權限問題和作出反應的基礎上經過境界你RLMErrorFilePermissionDenied那些。或者如果該文件不存在與RLMErrorFileNotFound。

我發現的一件棘手的事情是,當你得到一個更通用的RLMErrorFileAccess,但這是對堆棧溢出另一個問題......