EXEC_BAD_ACCESS при вызове метода SQLLite

1
sqlite3_stmt *stmt;

    NSString *selectQuery =[NSString stringWithFormat:@"select * from myaccount"];

    NSMutableArray *fl =[[NSMutableArray alloc]init];
    NSString *sname;
    NSString *myMobNo;
    NSMutableString *str = [[NSMutableString alloc]init];

    if (sqlite3_prepare_v2(db, [selectQuery UTF8String], -1, &stmt, nil) == SQLITE_OK) {
        while (sqlite3_step(stmt) == SQLITE_ROW) {

            sname = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 1)];
            myMobNo = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 4)];
            [str appendString:[NSString stringWithFormat:@"%@!%@",sname,myMobNo]];

            [fl addObject:str];

        }
    }

    sqlite3_finalize(stmt);

    return fl;

Я использую Objective C с SQL Lite в моем проекте. Когда я вызываю метод выше, я получаю ошибку как EXC_BAD_ACCESS при условии If. Что не так с моим кодом. Любая помощь будет оценена заранее.

  0x0003c099 -[DBModel getCName] + 112
1   Kinkey  0x0001d623 -[ChatViewController viewDidLoad] + 302
2   0x34dae579 <redacted> + 364
3   0x34e031f7 <redacted> + 26
4   0x34e0313d <redacted> + 28
5   0x34e03021 <redacted> + 32
6   0x34e02f4d <redacted> + 272
7   0x34e02699 <redacted> + 64
8   0x34e02581 <redacted> + 324
9   0x34df0b5b <redacted> + 858
10  0x34df07fb <redacted> + 38
11  0x0004cd33 -[ChatView tableView:didSelectRowAtIndexPath:] + 970
12  0x34e5131d <redacted> + 876
13  0x34ed3da9 <redacted> + 156
14  0x3388f657 <redacted> + 450
15  0x32f55857 <redacted> + 14
16  0x32f55503 <redacted> + 274
17  0x32f54177 <redacted> + 1230
18  0x32ec723d CFRunLoopRunSpecific + 356
19  0x32ec70c9 CFRunLoopRunInMode + 104
20  0x36aa533b GSEventRunModal + 74
21  0x34de32b9 UIApplicationMain + 1120
22  0x00002a31 main + 108
23  0x000024cc start + 40



NSMutableArray *Details = [[DBModel database]getCName];
    NSArray *array = [[Details objectAtIndex:0] componentsSeparatedByString:@"!"];
    acName = [array objectAtIndex:0];
    acMobileNo = [array objectAtIndex:1];

if ((char *)sqlite3_column_text(stmt4, 1)!= nil) {
        sname = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt4, 1)];
        }
  • 1
    Была ли db правильно инициализирована?
  • 0
    да. Это дает ошибку нерегулярно.
Показать ещё 7 комментариев
Теги:
exc-bad-access

2 ответа

2
Лучший ответ

Проблема также может быть вызвана, если указатель db не указывает на действительную открытую базу данных. Это может произойти, если (а) вы пренебрегли вызовом sqlite3_open а указатель db не был NULL; или (б) вы закрыли базу данных в какой-то момент и пренебрегли NULL db а затем пренебрегли ее повторным открытием, прежде чем пытаться использовать ее снова. В нижней строке, если вы передадите недопустимое значение, sqlite_prepare_v2 NULL, к sqlite_prepare_v2, вы EXC_BAD_ACCESS исключение EXC_BAD_ACCESS.

В остальном у вас есть другой риск исключения в этом коде: если одно из этих двух текстовых полей было NULL (например, либо в базе данных были значения NULL либо у вас неверные индексы столбцов (например, это индекс на основе нуля, sqlite3_column_text(stmt, 1) является вторым столбцом, sqlite3_column_text(stmt, 4) является пятым столбцом), ваша программа также генерирует исключение (хотя и другое исключение). В нижней строке вы не можете передать значение NULL в stringWithUTF8String без генерирования исключения. может попросить вас проверить эти два значения перед вызовом stringWithUTF8String. (Если у вас была определена ваша база данных, чтобы эти столбцы были NOT NULL, это немного stringWithUTF8String этот риск.)

  • 0
    Указатели не Objective C установлены в nil с ARC?
  • 1
    @trojanfoe Хороший вопрос. Согласно документам: «Используя ARC, сильные, слабые и автоматически высвобождающие переменные стека теперь неявно инициализируются с помощью nil ». Другие указатели, вероятно, ненадежно NULL . Я изменил свой ответ соответственно.
Показать ещё 13 комментариев
1

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

  • 0
    Есть ли проблема с БД?
  • 0
    Я думаю, что это проблема с памятью.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню