2011-07-09 59 views
1

我想知道爲什麼我們在這裏首先搜索與NSDocumentDirectory路徑:NSDocumentDirectory或NSBundle resourcePath與Sqlite?

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"Sports.sqlite"]; 

,稍後我們比較這路徑與另一條路徑,使用從一個NSBundle此時resourcePath:

NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] 
             stringByAppendingPathComponent:@"Sports.sqlite"]; 
success = [fileManager copyItemAtPath:defaultDBPath 
           toPath:writableDBPath error:&error]; 

什麼兩者之間的區別是什麼?

回答

1

在這種情況下(通常只有一次,除非需要恢復數據庫)將數據庫從只讀包複製到文檔目錄中,以便用戶可以讀取/寫入它。如果您想要預先設定數據庫的種子或只設置結構,這非常有用。

您的文檔目錄是可讀/寫的,因此您的bundle不是您需要在documents目錄中有sqlite以便正確使用它。

  1. 代碼的第一部分是僅僅讓你你想要的sqlite文件住在你的documents目錄的路徑。最終在writableDBPath舉行。

  2. 接下來你到

    ... copyItemAtPath:defaultDBPath toPath:writableDBPath ... 
    

這給了你,你在你的包提供一個讀/寫數據庫從bundledefaultDBPath),並使用兩個路徑的路徑。爲什麼要這樣做而不是在設備上運行SQL來創建模式?這使您可以用一些數據預先爲數據庫創建種子。它有時可以更容易使用圖形工具來設置和編輯您的sqlite文件

+0

非常感謝!關於這個「圖形工具」,你怎麼得到它?再次感謝 – Paul

+0

有幾個你可能最好的谷歌搜索和嘗試一些,但我個人喜歡SQL管理器插件的Firefox做得很好。它不適用於ERD,但可以比使用命令行更輕鬆地查看和操作表。 –

+0

好的,謝謝保羅! – Paul

1

你的意思是「比較」兩條路徑?

我看到的是從應用程序資源目錄到用戶文檔目錄的文件副本。

因此,發生的情況是將要與應用程序捆綁在一起的缺省版本Sports.sqlite(因此在資源目錄中可用)將被複制到用戶可以修改它的用戶目錄中。

第一塊代碼只是建立目標路徑(一個字符串);第二塊創建源路徑(一個字符串),然後進行復制。

它有道理嗎?

+0

非常感謝,非常有意義! – Paul