Проблемы с iOS + sqlite (EXC_BAD_ACCESS) - PullRequest
1 голос
/ 09 мая 2011

У меня действительно странный.У меня есть метод, который отлично работает, но я пытаюсь преобразовать его, чтобы сделать данные более управляемыми базой данных, чем жесткое кодирование, которое существует в настоящее время.Когда я добавляю вызов в свой метод базы данных для извлечения данных, я получаю EXC_BAD_ACCESS долго ПОСЛЕ того, как база данных завершена.Я сузил это до базы данных, так как, если я вообще не делаю вызов, сбой не произойдет.

Итак, вызов метода выглядит следующим образом (это гдеесли я закомментирую, это не приведет к сбою):

NSString *thisRoomNumber = [self readLocationsFromDatabaseBetweenPoints:fX YPoint:fY];

и сам метод выглядит так:

    #pragma mark -
#pragma mark SQL Operations
- (NSString *)readLocationsFromDatabaseBetweenPoints:(float)tapPointX YPoint:(float)tapPointY{

    // Setup some globals
    databaseName = @"db.sqlite";

    // Get the path to the documents directory and append the databaseName
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];
    databasePath = [documentsDir stringByAppendingPathComponent:databaseName];

    // Setup the database object
    sqlite3 *database;

    NSString *sqlStringBuilder = [NSString stringWithFormat:@"select * from floors where propertyid = ? and floorid = ? and %f between topleftxcoord and bottomrightxcoord and %f between topleftycoord and bottomrightycoord", tapPointX, tapPointY];

    NSString *roomNumber = @"0";

    // 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
        const char *sqlStatement =  [sqlStringBuilder UTF8String];

        NSLog(@"%@", [NSString stringWithUTF8String:sqlStatement]);

        sqlite3_stmt *compiledStatement;
        if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
            sqlite3_bind_int(compiledStatement, 1, iPropertyId);
            sqlite3_bind_int(compiledStatement, 2, iFloorId);           

            // Loop through the results and add them to the feeds array
            while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
                // Read the data from the result row
                NSInteger aLocId = sqlite3_column_int(compiledStatement, 0);
                NSInteger aTLX = sqlite3_column_int(compiledStatement, 1);
                NSInteger aTLY = sqlite3_column_int(compiledStatement, 2);
                NSInteger aBRX = sqlite3_column_int(compiledStatement, 3);
                NSInteger aBRY = sqlite3_column_int(compiledStatement, 4);
                NSString *aRoomIdent = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 5)];

                roomNumber = aRoomIdent;

            }
        }else{
            NSLog(@"%d", sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL));
        }
        // Release the compiled statement from memory
        sqlite3_finalize(compiledStatement);

    }
    sqlite3_close(database);


    [documentsDir release];
    [documentPaths release];
    //[roomNumber release];
    [sqlStringBuilder release];

    return roomNumber;
}

Сам вызов работает нормально.Я получаю результаты, как и ожидалось, «thisRoomNumber» возвращается с тем, что я ожидаю.Как только вызывающий метод запускает следующую часть, он возвращается к делегату, и в этот момент происходит сбой.Я знаю, что трудно увидеть, что происходит без большого количества кода, но огромное количество кода сделало бы этот пост МАССИВНЫМ.

Надеюсь, это даст нам отправную точку для исправления этого.Кроме того, дамп журнала аварий не дает абсолютно ничего полезного для этого.

Спасибо за любую помощь, которую вы, ребята, можете предоставить!Если вам нужна дополнительная информация, дайте мне знать, я сделаю все возможное, чтобы добавить к ней по мере необходимости.

1 Ответ

1 голос
/ 09 мая 2011

Ваши звонки в конце являются проблемой. Вы выпускаете объекты, которые не принадлежат вам. Удалите их, и все будет в порядке.

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