Таблица базы данных Sqlite3 не может открыться в XCode 4.2 - PullRequest
0 голосов
/ 03 февраля 2012

Я создаю и приложение для iphone, используя XCode 4.2.И я использую базу данных sqlite3 для приложения.Я успешно создал и запустил приложение на iPhone 3GS и с XCode 3.2.5, когда у меня возникли проблемы с XCode 4.2.Файл db не может быть открыт, вот пример кода для открытия таблицы.И когда я открыл тот же файл БД с помощью менеджера SQlite, я мог видеть таблицу.Я не понимаю, в чем ошибка.

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.
}

Пожалуйста, помогите, спасибо

1 Ответ

2 голосов
/ 01 октября 2013

Я думаю, вы поместили метод close не в том месте. Я использую SQLite3 в iOS в течение 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");
}

Это должно решить вашу проблему, потому что теперь вы собираетесь закрывать базу данных каждый раз, когда открываете ее. Но в вашем коде вы открываете его раз за разом, не закрывая его!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...