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目錄,而不是現在的支持文件是一個問題?
更新:我已重新啓動並重置模擬器,現在它似乎沒有將數據庫加載到文檔目錄中。任何幫助,將不勝感激。
是否有一個很好的教程,通過一種方式與另一種方式的優點,適當的檢查和平衡等。我是新來的遠程訪問我的數據庫,所以我想確保我在做它正確。 – user1454340 2012-08-04 14:29:00
在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
需要異步下載的原因是因爲TCP/IP以塊的形式提供數據。如果您的數據小於塊大小,那麼同步請求可能就足夠了。但是,如果它更大,那麼下載將在單獨的塊中到達,因此需要異步來逐步構建它。通過使用NSMutableData類型的實例變量,您可以在每個塊的下載過程中添加該變量,並且didFinishLoading ...方法可讓您知道它何時完成。 – SPA 2012-08-05 11:10:15