2012-06-28 196 views
4

我想從sqlite數據庫中讀取數據,並在ios應用程序的表格視圖中顯示它。但我無法打開sqlite數據庫出於某種原因,應用程序崩潰的消息 - 無法打開數據庫。ios - 打開sqlite數據庫

我使用Firefox sqlite管理器創建了數據庫,並將該文件複製到Xcode項目中。

這裏是我的代碼 -

-(NSString *)dataFilePath{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
    NSString *documentsDir = [paths objectAtIndex:0]; 
    return [documentsDir stringByAppendingPathComponent:kFilename]; 
} 

我試圖打開使用sqlite3_open_v2命令數據庫中的viewDidLoad中

sqlite3 *database; 

    if (sqlite3_open_v2([[self dataFilePath] UTF8String], &database, SQLITE_OPEN_READWRITE, NULL) != SQLITE_OK) { 
     sqlite3_close(database); // not sure you need to close if the open failed 
     NSAssert(0, @"Failed to open database"); 
    } 

回答

12

裏面這是我打開我的數據庫。我很長一段時間沒有做SQLite,除了提供我在自己的應用程序中使用的代碼之外,我無法給你很多幫助。這是我在我的應用程序中使用的一個類。

static sqlite3 *database; 
static sqlite3_stmt *enableForeignKey; 

@implementation DBAdapter 

+ (sqlite3 *)sharedInstance { 

    if (database == NULL) { 
     sqlite3 *newDBconnection; 

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

     if (sqlite3_open([path UTF8String], &newDBconnection) == SQLITE_OK) { 
      //NSLog(@"Database Successfully Opened :)"); 
      database = newDBconnection; 

      if (sqlite3_prepare_v2(database, "PRAGMA foreign_keys = ON", -1, &enableForeignKey, NULL) != SQLITE_OK) { 
       NSLog(@"ERROR IN PRAGMA!"); 
      } 

      sqlite3_finalize(enableForeignKey); 

     } else { 
      NSLog(@"Error in opening database :("); 
      database = NULL; 
     } 
    } 

    return database; 
} 
3

我正確地假設你的問題在我們的討論中被回答在ios - sqlite prepare statement的評論中?也就是說,我們希望確保數據庫包含在捆綁包中(通過確認Xcode中的「複製捆綁軟件資源」設置來確定目標的「構建階段」),並且希望您的應用程序檢查數據庫的存在在您的文檔文件夾中,如果它不存在,您將從您的文檔文件夾([[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:kFilename])複製到您的文檔文件夾。

這可能超出了原始問題的範圍,但是當您考慮最終部署應用程序時,更重要的是隨後升級/發佈應用程序時,可能需要將一些表添加到數據庫中內部數據庫版本號,您可以使用該版本號確定用戶在其文檔文件夾中具有的數據庫版本,並對該數據庫進行任何修改,以支持最新版本的應用。只是一個想法。

無論如何,如果您仍然有任何未解決的問題,請告訴我們。否則,我會認爲我們已經解決了你的問題。

+0

哈哈,是的,這是正確的 –