iphone sqlite запрос падает, если строки не возвращены - PullRequest
3 голосов
/ 10 января 2010

В моем проекте iPhone есть следующая функция, которая прекрасно работает ... если только запрос ничего не возвращает, а затем приложение не работает. Трудно отлаживать, когда ни одна из точек останова не активирована вообще!

Я знаю, что это работает, когда я передаю статический материал, который находится в БД, и он возвращает значение.

-(NSString *)getSomeText:(NSString *)toPass {
    sqlite3 *database;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *databasePath = [documentsDirectory stringByAppendingPathComponent:@"sf.sqlite"];

    int strLength = 0;
    strLength = [toPass length];

    if (strLength <3)
        return @"Unknown";


    NSString *MIDstr;
    NSMutableString * toPass Copy = [NSMutableString stringWithString:toPass];
    MIDstr = [toPassCopy substringWithRange:NSMakeRange(0, 3)];


    // 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
        NSString *BaseSQL = [NSString stringWithFormat:@"select * from MIDS where MID = '%@'",MIDstr];
        NSLog(BaseSQL);

        const char *sqlStatement = [BaseSQL UTF8String];
        //NSLog(BaseSQL);
        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) {


                    NSString *aName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
                    NSString *returnString = [NSString stringWithFormat:@"%@",aName];
                    return returnString;                

            }
        }
        // Release the compiled statement from memory
        sqlite3_finalize(compiledStatement);

    }
    sqlite3_close(database);

}

Ответы [ 2 ]

4 голосов
/ 10 января 2010

A. если sqlite3_step не возвращает ни одной строки, происходит сбой, потому что вы объявили, что возвращаете строку NSString, но когда строк нет, вы ничего не возвращаете. Вызывающая сторона попытается прочитать строку NSString из стека и, таким образом, в итоге разыменовывает мусор.

Чтобы быстро решить проблему, напишите:

    sqlite3_close(database);
    return nil;
}

и убедитесь, что вызывающая сторона обрабатывает ноль результатов.

B / Если у вас есть данные, ваш код никогда не сможет вызвать sqlite3_finalize и sqlite3_close , поскольку вы вернетесь раньше:

while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
    [..]
    return returnString;
0 голосов
/ 28 декабря 2012
while (sqlite3_step(sqlstatement) == SQLITE_ROW )
            {
                //Your code goes here

            }

            sqlite3_finalize(sqlstatement);
            sqlite3_close(databaseRefObj);

закройте базу данных и завершите ваше утверждение после цикла while, это помогло мне,

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