Приложение базы данных не работает должным образом - PullRequest
0 голосов
/ 24 марта 2011

В моем приложении я много раз открываю базу данных в одном цикле, а затем снова открываю базу, она не выполнит if (sqlite3_open([[self getDBPath] UTF8String], &database) == SQLITE_OK) это утверждение, поэтому мое приложение не работает ....

-(NSString *)getDBPath
{

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];

    return [documentsDir stringByAppendingPathComponent:@"BasicGreetings.sqlite"];

}



-(void) fillimage:(NSInteger)imgno
{
    testAppDelegate *appDelg = (testAppDelegate *)[[UIApplication sharedApplication]delegate];

    sqlite3 *database= nil;

    if (sqlite3_open([[self getDBPath] UTF8String], &database) == SQLITE_OK)
    {

        const char *sql = "select setflag from Tblsetflag where imgNo = ?";
        sqlite3_stmt *selectStmt = nil;

        if (sqlite3_prepare_v2(database, sql, -1, &selectStmt, NULL) == SQLITE_OK) 
        {
            sqlite3_bind_int(selectStmt, 1,imgno);

            while (sqlite3_step(selectStmt) == SQLITE_ROW)
            {
                appDelg.a = sqlite3_column_int(selectStmt, 0);
                NSLog(@"%d",appDelg.a);
            }
        }


    }
    sqlite3_close(database);



}

Ответы [ 2 ]

3 голосов
/ 24 марта 2011

Можете ли вы опубликовать код в getDBPath, я подозреваю, что он не может найти файл ... проверьте значение, которое вы возвращаете из этого метода (запустите в симуляторе) и просмотрите каталог документов симулятора в Finder и убедитесь, что файл существует.

1 голос
/ 24 марта 2011

Не открывайте и не закрывайте базу данных при каждом проходе по вашему -fillimage: методу. Вы действительно должны открыть его один раз в начале вашего приложения (или когда ваше приложение стало активным из фона) и закрыть его, когда ваше приложение выходит или уходит в фоновый режим.

Вы также никогда не завершаете свое подготовленное утверждение, которое может привести к неудаче sqlite3_close(). Опять же, вы можете захотеть создать подготовленный оператор один раз, а затем сбрасывать его каждый раз при запуске этого метода и завершать его до закрытия базы данных SQLite.

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