2015-01-04 3 views
1

У меня есть инструкция insert для моей таблицы sqlite, которая содержит апострофы в значениях.Как правильно избежать одиночных кавычек в инструкции SQLite insert - iOS

NSString *sqlInsert = [NSString stringWithFormat:@"insert into myTable (_id, name, area, title, description, url) VALUES (%i, '%@', '%@', '%@', '%@', '%@')", tempObject.ID, tempObject.name, tempObject.area, tempObject.title, tempObject.description, tempObject.url]; 

Результаты этой строки это

insert into myTable (_id, name, area, title, description, url) VALUES (0, 'John Smith', 'USA', 'Programmer', 'John Smith is a programmer. He programs a lot. John Smith's duty is to program. He loves it. His dog's name is Billy.', 'www.google.com') 

Когда я пытаюсь вставить, что в таблицу, я получаю ошибку синтаксиса рядом «с». Я хочу правильно избежать апострофов. Как мне это сделать? Спасибо, любое понимание оценено!

Редактировать: Мы решили проблему. Мы ввели некоторые одиночные кавычки (') в наши строки, где нам действительно нужны фигурные одинарные кавычки. Кудрявые одинарные кавычки не возиться с операторами вставки SQLite. Для тех, у кого есть эта проблема, вы можете использовать одиночные фигурные кавычки вместо обычных одинарных кавычек. Это может быть невозможно в ваших обстоятельствах, но для некоторых это может быть простое решение.

+1

Не используйте 'stringWithFormat' для создания запроса. Сделайте это правильно с помощью операторов 'sqlite3_bind_xxx'. – rmaddy

+0

См. Этот ответ: http://stackoverflow.com/questions/17855029/insert-special-character-in-sqlite/17855164#17855164 – rmaddy

ответ

3

Проблема заключается в том, что ваши данные содержат в себе одну кавычку. У вас есть два варианта, чтобы преодолеть это.

  1. побег ' с \'
  2. Использование sqlite3_bind_xxx() метода для связывания значений (Я предпочитаю этот метод). Вы можете сделать это нравится:


NSString *sqlInsert = @"insert into myTable (_id, name, area, title, description, url) VALUES (?, ?, ?, ?, ?, ?)"; 
if (sqlite3_open([yourDBPath UTF8String], &yourDB) == SQLITE_OK) 
{ 
    if (sqlite3_prepare_v2(yourDB, sql, 1, &stmt, NULL) == SQLITE_OK) 
    { 
     sqlite3_bind_int(stmt, 1, tempObject.ID); 
     sqlite3_bind_text(stmt, 2, [tempObject.name UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(stmt, 3, [tempObject.area UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(stmt, 4, [tempObject.title UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(stmt, 5, [tempObject.description UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(stmt, 6, [tempObject.url UTF8String], -1, SQLITE_TRANSIENT); 
     // Execute 
    } 
} 
+0

Может кто-нибудь объяснить, почему индексы столбцов 'sqlite3_bind_xxx' основаны на 1, но индексы столбцов из 'sqlite3_column_xxx' основаны на 0? Приносит мне орехи (извините, напыщенная речь). :) – rmaddy

+0

@rmaddy Я думаю, что это потому, что 'sqlite3_bind_xxx' должен работать и для именованных параметров, а' sqlite3_bind_parameter_index' возвращает 0 в качестве кода ошибки (когда нет соответствующего параметра). –

+2

В SQL одиночные кавычки не сбрасываются с обратной косой чертой. –

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