Ошибка вставки FMDB sqlite

Исходя из фона, отличного от SQL, я создаю простую таблицу с именем test с 3 полями:

    NSString *testtable = @"create table if not exists test(testid integer primary key, userid integer, contentid text)";
if (![db executeUpdate:testtable]) {
    NSLog(@"create test, %d:%@", [db lastErrorCode], [db lastErrorMessage]);
    return NO;
}

когда я вставляю запись в таблицу, я получаю ошибку exc_bad_access:

    if (![db executeUpdate:@"insert into test values(?,?,?)", NULL, 1, @"HELLO"]) {
    NSLog(@"insert test, %d:%@", [db lastErrorCode], [db lastErrorMessage]);
    return NO;
}

Если я изменю тип столбца «userid» с целого на текстовый, это будет работать хорошо. И я тестирую таблицу с помощью команды sqlite на консоли, она тоже работает хорошо. Что вы думаете, ребята? Спасибо...

я пробую другой способ справиться с этой проблемой:

    if (![db executeUpdate:@"insert into test values(?,?,?)", NULL, [NSNumber numberWithInt:1], @"HELLO"]) {
    NSLog(@"testint, %d:%@", [db lastErrorCode], [db lastErrorMessage]);
    return NO;
}

тогда это работает. Не могу сказать в чем причина... Возможно, fmdb поддерживает только вставку объектов.


person user1396268    schedule 15.05.2012    source источник
comment
Просто наш NSLog с ErrorCodes помог мне решить мою проблему... +1   -  person CampbellGolf    schedule 29.01.2014


Ответы (2)


Я считаю, что FMDB нужны объекты для замены ? и int не являются объектами. Измените 1 на [NSNumber numberWithInt:1]

Кроме того, где вы открываете свою базу данных, у вас есть что-то подобное?

db = [FMDatabase databaseWithPath:writableDBPath];

    if ([db open]) {

Добавьте [db setTraceExecution:TRUE]; сразу после этого, и он запишет для вас ваш текст SQL.

Можно сначала создать свой SQL NSString и вставить свой int, а затем заставить FMDB просто запустить уже заполненную строку.

person Darren    schedule 15.05.2012
comment
Да, Даррен, ты прав. я внимательно прочитал документ fmdb, нашел это: все аргументы, предоставленные методу -executeUpdate: (или любому из вариантов, которые принимают va_list в качестве параметра), должны быть объектами. Следующее не будет работать (и приведет к сбою). Я пытаюсь использовать executeUpdateWithFormat в своем коде, он работает хорошо. И я добавляю traceExecution по вашему предложению. Теперь я могу получить больше информации от fmdb. Спасибо! - person user1396268; 16.05.2012

executeUpdate: поддерживает только объекты, переданные в качестве значений-заполнителей. Вы можете использовать executeQueryWithFormat: если вы предпочитаете аргументы в стиле printf (где вы можете использовать %d для представления своего числа). Лично я бы придерживался объектов, поскольку executeQueryWithFormat: все равно в конечном итоге преобразует значения в объекты.

person ccgus    schedule 15.05.2012