我正在使用XCode 4.2创建和iphone应用程序。我正在使用sqlite3数据库的应用程序。当我遇到XCode 4.2问题时,我在iPhone 3GS和XCode 3.2.5上成功创建并运行了应用程序。 db文件无法打开,下面是打开Table的示例代码。当我使用SQlite管理器打开相同的db文件时,我可以看到该表。我不明白错误是什么。
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 :(得分:2)
你认为关闭方法在错误的地方。我已经在iOS中使用SQLite3两周了,我遇到了这个问题。我通过将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");
}
这可以解决您的问题,因为现在您每次打开它时都会关闭数据库。但是在你的代码中你一次又一次打开它而不关闭它!