2012-02-03 85 views
0

我正在使用XCode 4.2创建iphone应用程序。我正在使用sqlite3数据库的应用程序。当我在XCode 4.2上遇到问题时,我在iPhone 3GS和XCode 3.2.5上成功创建并运行了该应用程序。 db文件无法打开,这里是打开表格的示例代码。当我使用SQlite管理器打开同一个db文件时,我可以看到表格。我不明白错误是什么。Sqlite3数据库表无法在XCode 4.2中打开

static sqlite3 *database = nil; 
static sqlite3_stmt *selectStmt = nil; 

+ (void) getInitialDataToDisplay:(NSString *)dbPath { 
    NSLog(@"Path: %@",dbPath); 
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) { 
     NSString *sqlStr = @"select * from Space"; 
     const char *sql = [sqlStr UTF8String]; 
     sqlite3_stmt *selectstmt; 
     if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) { 
      while(sqlite3_step(selectstmt) == SQLITE_ROW) { 
       NSInteger primaryKey = sqlite3_column_int(selectstmt, 0); 
       SpaceClass *spaceObj = [[SpaceClass alloc] initWithPrimaryKey:primaryKey]; 
       spaceObj.spacePK = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)]; 
       spaceObj.spName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 3)]; 
       spaceObj.spDescrptn = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 4)];    
       [appDelegate.spaceArray addObject:spaceObj]; 
       [spaceObj release]; 
      } 
     }else 
      NSLog(@"not ok"); 
    } 
    else 
     sqlite3_close(database); //Even though the open call failed, close the database connection to release all the memory. 
} 

请帮帮忙,谢谢

+0

你可以检查'NSLog(@“Error =%s”,sqlite3_errmsg(&db))'给出了什么? – iNoob 2012-02-03 12:13:58

回答

2

你把接近的方法错了地方,我认为。我一直在iOS中使用SQLite3 2周,我有这个问题。我通过将SQLite3_close方法放在if(open == ok)的最后一行来解决这个问题。

您的代码应该是这样的:

if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) 
{  
    if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) 
    { 
     while(sqlite3_step(selectstmt) == SQLITE_ROW) 
     { 

     } 
    } 
    else 
    { 
     NSLog(@"not ok"); 
    } 
    //here you should close database, before exit from if open block 
    sqlite3_close(database); 
} 
else 
{ 
    //here is not needed because of database open failure 
    //sqlite3_close(database); 
    NSLog(@"not ok"); 
} 

因为现在你要每次打开它时关闭数据库,这应该解决您的问题。但是在你的代码中,你一次又一次地打开它而不关闭它!