Нужна проверка работоспособности моего запроса SQLite? - PullRequest
0 голосов
/ 10 мая 2011

Простое приложение для iPhone, которое показывает пользователю список купонов в зависимости от выбранной ими категории купонов.

Я еще не проверял это, потому что я все еще далек от того, чтобы даже построить интерфейс - я просто хотел проверить здравый смысл моего подхода здесь, прежде чем я в конце концов погоню за какой-нибудь сумасшедшей ошибкой в ​​течение нескольких дней.

- (BBSelectedCoupons *)BBSelectedCoupons:(char)SelectedCategory {
   BBCouponDetails *retval = nil;
   NSString *query = [NSString stringWithFormat:@"SELECT id, MerchantName, ShortDeal 
   FROM coupons JOIN SelectedCategory ON coupons.CouponID=SelectedCategory.CouponID 
   ORDER BY id ASC WHERE SelectedCategory=%d", SelectedCategory];

У меня следующие вопросы:

1) Могу ли я использовать (char) в строке 1 как есть? Примеры, которые я видел, используют только (int).

2) В строках 4 и 5 я использую термин «SelectedCategory» дважды - один раз для ссылки на таблицу сразу после JOIN, а второй - для ссылки на вторую таблицу, являющуюся частью теста. Затем, после ГДЕ, я только один раз определил «SelectedCategory» - это сработает? Я планирую определить «SelectedCategory» на основе кнопки, которую нажимает пользователь.

3) В строке 5 "% d" будет хорошо играть с переменной "string"? Или это должно быть что-то вроде "$ d" или "@d"?

Спасибо всем, кто мог взглянуть и дать мне «хорошо выглядеть» или «ты отстой».

Если я отстой, ссылка на что-то, что я могу прочитать, будет очень признательна!

1 Ответ

0 голосов
/ 10 мая 2011
  1. Конечно, почему бы и нет?
  2. Вы можете устранить неоднозначность, используя короткое имя. Используя более короткий пример: select * from table t where t.col1 = 5;
  3. %d действительно относится к целому числу, поэтому вы можете получить странные результаты. Я не собираюсь искать правильный формат для символа, потому что я не думаю, что это хороший подход. Вы действительно должны использовать параметры связывания. Для этого вы определяете запрос с вопросительным знаком, где у вас есть %d. Затем, прежде чем выполнить свой запрос, вы sqlite3_bind_int «заполните» поле. Это позволяет избежать использования SQL-инъекций при использовании строковых полей и имеет некоторые преимущества в производительности (поскольку вы можете заранее подготовиться).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...