2012-07-01 20 views
0

我想連接一個sqlite3數據庫文件,我叫Login.sql到我寫的iPhone應用程序。儘管我嘗試在包括Documents文件夾,包含xcode項目的文件夾以及該項目的Dervived Data在內的多個位置放入文件,但Xcode似乎並未識別該文件。下面的代碼是在didFinishLaunchingWithOptions中的AppDelegate文件(它使用的是在視圖控制器,但我把它想它會工作Xcode不識別本地數據庫。似乎無法連接到sqlite3數據庫文件

這裏是代碼: 的NSString * DOCSDIR;

NSArray *dirPaths; 

// databaseName = [[NSBundle mainBundle] pathForResource:@"DBLogin.sql" ofType:@"db"]; 

databaseName= @"Login.sql"; 

// Get the documents directory 

dirPaths = NSSearchPathForDirectoriesInDomains(

               NSDocumentDirectory, NSUserDomainMask, YES); 



docsDir = [dirPaths objectAtIndex:0]; 


NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

NSString *documentsDir = [documentPaths objectAtIndex:0]; 

databasePath = [documentsDir stringByAppendingPathComponent:databaseName]; 



// Build the path to the database file 

//databasePath = [[NSString alloc]      initWithString: [docsDir stringByAppendingPathComponent:          @"DBLogin.sql"]]; 



NSFileManager *filemgr = [NSFileManager defaultManager]; 



if ([filemgr fileExistsAtPath: databasePath ] == NO) 

{ 


    const char *dbpath = [databasePath UTF8String]; 





    if (sqlite3_open(dbpath, &database) == SQLITE_OK) 

    { 

     NSLog(@"DATABASE LOADED"); 

     char *errMsg; 

     const char *sql_stmt = "CREATE TABLE IF NOT EXISTS User (id varchar(20) PRIMARY KEY , password varchar(20))"; 



     if (sqlite3_exec(database, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK) 

     { 

      status.text = @"Failed to create table"; 

     } 



     status.text = @"Database Connected"; 



     sqlite3_close(database); 



    } else { 

     status.text = @"Failed to open/create database"; 

    } 

} 

else{ 

    NSLog(@"Connect!"); 

} 




return YES; 

的加密數據庫文件的代碼在這裏:Xcode login screen sqlite3 database authentication issue我只是包含它以防這種代碼可能導致問題

基本上每次我在這段代碼中放置一個新的數據庫來查看是否是這個問題我認爲代碼用table創建一個新的臨時sql數據庫文件在表中不存在函數。我不知道該怎麼做,這讓我瘋狂。如果任何人有任何想法如何讓這個代碼來識別我的數據庫,這是值得讚賞的。我已經將數據庫鏈接到了複製束資源構建頁面,但它仍然不'訪問它。

讓我知道你是否需要任何其他信息。

在此先感謝!

+0

在您的代碼上運行縮進。 – 2012-07-03 03:47:53

+0

什麼是縮進? – user1431272

+0

http://www.gnu.org/software/indent/ – 2012-07-03 13:09:10

回答

3

我會給你我訪問sqlite3數據庫的步驟。

1.首先,我創建一個空的sqlite數據庫與所需的表(使用firefox的SQLite管理器加載項或任何其他方便的方法)。並將其添加到我的項目中。

2.獲取數據庫文件的路徑。

BOOL success; 

NSArray*dirPath; 
NSString*docDir; 
NSString*databasePath; 
NSString*[email protected]"yourDB.sqlite"; 

//path for database 
dirPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
docDir=[dirPath objectAtIndex:0]; 
databasePath=[docDir stringByAppendingPathComponent:databaseName]; 

使用NSFileManager檢查,如果它已經存在於DocumentDirectory。如果它不存在(第一次運行),請將其替換爲保存在數據包中的數據庫(從第一步開始)。

//check if present 
NSFileManager*fm=[NSFileManager defaultManager]; 
success=[fm fileExistsAtPath:databasePath]; 

if(success) 
{ 
    NSLog(@"Already present"); 
} 
else 
{ 

    //Copy from bundle to DocumentsDirectory on first run. Where DB won't be available in DocumentsDirectory. 
     NSString*bundlePath=[[NSBundle mainBundle] pathForResource:@"yourDB" ofType:@"sqlite"]; 
NSError*error; 
success=[fm copyItemAtPath:bundlePath toPath:databasePath error:&error]; 

if(success) 
{ 
    NSLog(@"Created successfully"); 
} 

} // End of else when DB not present in documents directory. 

這樣做了以後,你就會有你的包手動添加到文檔目錄的空白數據庫,所有的改變將對其執行(而不是在包)。在此之後,您可以繼續執行數據庫操作函數的其餘部分。

編輯:方法來訪問DB

這是我來擷取DB值,就嘗試了這一點。

if(sqlite3_open([dbpath UTF8String], &database)==SQLITE_OK) //Check if it opens properly 
{ 
    NSString*queryStmt=[NSString stringWithFormat:@"select * from sometable"]; 
    const char*querystmt=[queryStmt UTF8String]; 
    sqlite3_stmt *statement; 

    if(sqlite3_prepare(database, querystmt, -1, &statement, NULL)==SQLITE_OK) // Check if prepare statment has no issues 
    { 
     while(sqlite3_step(statement)==SQLITE_ROW) // Consists of row. 
     { 
      NSString*thestring=[[NSString alloc] initWithUTF8String:(const char*)sqlite3_column_text(statement, 0)];// 0 will be first column 
      NSLog(@"%@",thestring); 
     } 

     sqlite3_finalize(statement); //finalize statement 
    } 

    sqlite3_close(database); //Close database 
} 
+0

謝謝!到目前爲止它工作的一半。我可以訪問數據庫並讀取其中一個條目,但它只有第一個條目,而不是我在數據庫中的其他三行。此外,當我做一個while循環(代碼爲這是鏈接問題)我得到一個無限循環重複第一行的內容。關於這個問題的任何想法? – user1431272

+0

@ user1431272,嗯,如果你的意思是你問的鏈接的答案,據我所知,它被稱爲「準備步驟完成」,但我沒有看到最終的步驟。這可能不是問題,但仍然檢查它。我將編輯答案以包含訪問方法。看看有沒有變化。 – iNoob

+0

@ user1431272,嘗試編輯的方法。如果問題仍然存在,請告訴我。 – iNoob

0

的問題可能是你的數據庫擴展,創建一個名爲DB Login.sqlite而不是Login.sql爲iPhone sqlite3的框架只能識別.sqlite數據庫。

然後你編碼將工作。

+0

我昨天試過一個.sqlite擴展,它沒有改變任何東西。 – user1431272