2012-08-04 34 views
0

我一直在使用以下代碼從我的應用程序中的支持文件中提取sqlite數據庫。這工作正常,沒有問題。從文檔目錄中提取數據庫

NSFileManager *fileMgr = [NSFileManager defaultManager]; 
NSString *dbPath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"TulsaListBars.sqlite"]; 
BOOL success = [fileMgr fileExistsAtPath:dbPath]; 
if(!success) 
{ 
    NSLog(@"Cannot locate database file '%@'.", dbPath); 
}else{ 
    NSLog(@"File Exists: %@", dbPath); 
} 
if(!(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK)) 
{ 
    NSLog(@"An error has occured: %s", sqlite3_errmsg(db)); 
}  
const char *sql = "SELECT * FROM Locations WHERE bar = 'yes'"; 
sqlite3_stmt *sqlStatement; 
if(sqlite3_prepare(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK) 
{ 
    NSLog(@"Problem with prepare statement: %s", sqlite3_errmsg(db)); 
} 

我沒有從支持文件中刪除數據庫並放到服務器上。我正在使用以下代碼將數據庫從服務器拉入我的文檔目錄。我已驗證該文件是否已到達文檔目錄,並且對所有表格都是準確的。不過,我現在得到一個錯誤「與準備語句問題:沒有這樣的表:位置」

NSURL *url = [NSURL URLWithString:@"my web site/TulsaListBars.sqlite"]; 
NSData *data = [NSData dataWithContentsOfURL:url]; 
NSString *appDocDir = [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES) lastObject]; 
NSString *storePath = [appDocDir stringByAppendingPathComponent:@"TulsaListBars.sqlite"]; 
[data writeToFile:storePath atomically:TRUE]; 

這與DB在My Documents目錄,而不是現在的支持文件是一個問題?

更新:我已重新啓動並重置模擬器,現在它似乎沒有將數據庫加載到文檔目錄中。任何幫助,將不勝感激。

回答

0

dataWithContentsOfURL正在同步下載數據庫文件,並且可能無法獲取整個文件。

更改的方法來異步NSURLConnection的並使用委託方法didReceiveData要追加到一個NSMutableData對象和connectionDidFinishLoading利用該對象的。

+0

是否有一個很好的教程,通過一種方式與另一種方式的優點,適當的檢查和平衡等。我是新來的遠程訪問我的數據庫,所以我想確保我在做它正確。 – user1454340 2012-08-04 14:29:00

+0

在Apple開發庫中,指南'URL加載系統編程'有一個名爲[使用NSURLConnection]的部分(https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection .html#// apple_ref/doc/uid/20001836-BAJEAIEE),並提供所需步驟的示例。 – SPA 2012-08-05 11:09:19

+0

需要異步下載的原因是因爲TCP/IP以塊的形式提供數據。如果您的數據小於塊大小,那麼同步請求可能就足夠了。但是,如果它更大,那麼下載將在單獨的塊中到達,因此需要異步來逐步構建它。通過使用NSMutableData類型的實例變量,您可以在每個塊的下載過程中添加該變量,並且didFinishLoading ...方法可讓您知道它何時完成。 – SPA 2012-08-05 11:10:15