2010-07-19 169 views
0

我試圖從數據庫中選擇數據,我有以下代碼取代: 代碼:SQLite的問題 - 數據庫路徑

// Setup the database object 
sqlite3 *database; 

// Init the animals Array 
list = [[NSMutableArray alloc] init]; 
NSLog(@"documents path: ", documentsDir); 
NSLog(@"database path: ", databasePath); 

// Open the database from the users filessytem 
if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) 
{ 
    // Setup the SQL Statement and compile it for faster access 
    const char *sqlStatement = "select route_name from Route"; 
    sqlite3_stmt *compiledStatement; 
    if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) 
    { 
    // Loop through the results and add them to the feeds array 
    while(sqlite3_step(compiledStatement) == SQLITE_ROW) 
    { 
    // Read the data from the result row 
    NSString *aName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)]; 

    // Add the animal object to the animals Array 
    //[list addObject:animal];  
    [list addObject:aName];  
    //[animal release]; 
    } 
    } 
    // Release the compiled statement from memory 
    sqlite3_finalize(compiledStatement); 
} 
sqlite3_close(database); 

我得到EXC_BAD_ACCESS錯誤在第一個IF語句。任何任何想法。

另外在NSLOG文檔中,DIR和databasePath是空的。

我在viewDidLoad中下面的代碼:

-(void)viewDidLoad 
{ 
// Setup some globals 
databaseName = @"xxxxxxCoreData.sqlite"; 

// Get the path to the documents directory and append the databaseName 
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
// NSString *documentsDir = [documentPaths objectAtIndex:0]; 
documentsDir = [documentPaths objectAtIndex:0]; 
databasePath = [documentsDir stringByAppendingPathComponent:databaseName]; 
+0

發佈'NSLog(「%@」,databasePath)的輸出;' – 2010-07-19 14:20:16

+0

看起來像documentsDir有問題,EXC_BAD_ACCESS錯誤在這裏發生,控制檯中沒有顯示任何內容。 – Stephen 2010-07-19 14:29:31

+0

我稍微修改了代碼,現在我正在獲取數據庫路徑,但它不會通過以下IF語句: if(sqlite3_open([databasePath UTF8String],&database)== SQLITE_OK) – Stephen 2010-07-19 16:12:30

回答

1

它看起來像databasePath不被保留,這樣的觀點負載和數據庫代碼運行的時間之間,它已經被釋放。如果你想保持周圍這些變量,則需要在最後兩行改成這樣:

documentsDir = [[documentPaths objectAtIndex:0] retain]; 
databasePath = [[documentsDir stringByAppendingPathComponent:databaseName] retain]; 

而且因爲你在viewDidLoad這樣做,你應該在viewDidUnload(組釋放他們以零在這種方法好吧)和dealloc

+0

感謝您的工作。 – Stephen 2010-07-20 08:22:12