2012-05-15 3 views
4

Исходя из фона, не SQL, я создать простую таблицу, названный тест, с 3-мя полями:FMDB SQLite вставки не удалось

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 поддерживает только вставку объекта.

+0

Только наш NSLog с ErrorCodes помог мне решить мою проблему ... +1 – CampbellGolf

ответ

2

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

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

db = [FMDatabase databaseWithPath:writableDBPath]; 

    if ([db open]) { 

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

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

+0

да, Даррен, вы правы. Я внимательно прочитал документ fmdb: «Все аргументы, предоставляемые методу -executeUpdate: (или любой из вариантов, которые принимают параметр va_list в качестве параметра), должны быть объектами. Следующие действия не будут работать (и это приведет к crash) «Я пытаюсь использовать executeUpdateWithFormat в своем коде, он работает хорошо. И добавьте traceExecution по вашему предложению. Теперь я могу получить больше информации от fmdb. Благодаря! – user1396268

0

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

+0

привет, ccgus, спасибо вам теплое сердце, теперь я понимаю. – user1396268

Смежные вопросы