Ответ Майкла Даутермана совершенно прав, как показывает этот скринкаст:
Что вы видите, это контроллер просмотра страницы с несколькими страницами ( пронумерованы так, чтобы вы могли видеть порядок), каждая страница содержит кнопку «Далее», и я неоднократно нажимаю кнопку «Далее», чтобы перейти к следующей странице.
Как и ваш, мой проект, показанный на скриншоте выше , имеет иерархию контроллера представления:
Похоже, что суть вашего вопроса заключается не столько в том, какой метод заставляет контроллер просмотра страницы перейти на следующую или предыдущую страницу - как вы уже сказали, это просто setViewControllers:...
, но как кнопка связывается с иерархией контроллера представления. В моем примере это означает отправку сообщения с кнопки внутри представления страницы, мимо контроллера просмотра страницы, мимо UIPageViewController и до ViewController, который затем сообщает UIPageViewController, что делать.
Я могу подумайте о многочисленных способах этого:
tabBarController
), которое затем отправляет сообщение вниз в его текущий выбранный контроллер представления, ViewController parentViewController!.parentViewController!
, который является ViewController. Что я предпочитаю? Лично мне больше всего нравится ничтожное действие, потому что он не требует лишнего кода. Единственная реализация func pageNextButton()
находится в ViewController. Это красота действия nil-target: он поднимает цепочку ответчиков, ищет получателя, автоматически . Контроллер просмотра страницы и UIPageViewController вообще не имеют кода в этом отношении.
Мне нравится это намного лучше, чем parentViewController!.parentViewController!
, потому что последнее требует в конечном счете, чтобы контроллер вида страницы знал имя метода в ViewController, который он может вызывать, и он должен сбрасываться на ViewController, который не очень портативен и, по моему мнению, слишком много знает о своей среде. С другой стороны, с помощью ничтожного действия отправитель полностью агностик о том, кем будет реальная цель! Поэтому мне больше всего нравится действие nil-target, а второе - лучшее.
Модуль sqlite3
поддерживает два вида заполнителей для параметров:
Используйте один или несколько ?
, чтобы отметить положение каждого параметра и предоставить список или кортеж параметров. Например ::
curs.execute("SELECT weight FROM Equipment WHERE name = ? AND price = ?",
['lead', 24])
Используйте :par
заполнители для каждого именованного параметра и поставьте dict. Например:
curs.execute("SELECT weight FROM Equipment WHERE name = :name AND price = :price",
{name: 'lead', price: 24})
Преимущества названных параметров стиля - это то, что вам не нужно беспокоиться о порядке параметров, и каждый :par
может использоваться несколько раз в больших / сложных SQL-запросах.
Ты пробовал это? :
for item in self.inventory_names:
t = (item,)
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", t)
self.cursor.close()
cursor.execute () ожидает, что последовательность (список, кортеж) будет вторым параметром. (-> ddaa)
Аргумент cursor.execute
, который представляет значения, которые вам нужно вставить в базу данных, должен быть кортежем (последовательность). Однако рассмотрим этот пример и посмотрим, что происходит:
>>> ('jason')
'jason'
>>> ('jason',)
('jason',)
В первом примере вместо этого вычисляется строка; поэтому правильный способ представления однозначного кортежа аналогичен во второй оценке. Во всяком случае, код, приведенный ниже, чтобы исправить вашу ошибку.
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", (item,))
Также давая аргументы значения cursor.execute
как строки (это то, что вы делаете) приводит к первой оценке в примере и результатам в ошибка, которую вы получаете.
каждый элемент элементов должен быть кортежем. предполагая, что имена выглядят примерно так:
names = ['Joe', 'Bob', 'Mary']
вы должны сделать следующее:
for item in self.inventory_names:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", (item, ))
, используя (item,), вы делаете его кортежем вместо строки.
Цитата (это то, что означают парнеры?)? с парнесом, похоже, работает на меня. Я продолжал пытаться (буквально)? » но я продолжал получать
ProgrammingError: Неправильное количество привязок. Текущий оператор использует 0 и есть 1.
blockquote>Когда я это сделал:
ВЫБЕРИТЕ факт ОТ ФАКТОИДОВ ГДЕ клавиша LIKE (?)
blockquote>вместо:
SELECT fact FROM factoids WHERE key LIKE '?'
blockquote>Это сработало.
Это какая-то вещь python 2.6?
SELECT fact FROM factoids WHERE key LIKE ?
. Просто случается, что добавление скобок в SQL не изменяет значения, поэтому SELECT fact FROM factoids WHERE key LIKE (?)
эквивалентно без ().
– Lie Ryan
3 April 2011 в 18:49
SELECT fact FROM factoids WHERE key LIKE "%s"
, вы также захотите избежать кавычек. cursor.execute()
не распознает% s как привязку в этом запросе. Поэтому используйте cursor.execute("Select fact FROM factoids WHERE key LIKE %s", (key_name, ))
– MrOodles
31 May 2012 в 17:44
Попробуйте
execute("select fact from factoids where key like ?", "%%s%" % val)
Вы вообще ничего не обмениваете вокруг ?
, Python sqlite корректно преобразует его в цитируемый объект.
cursor.execute("SELECT * from %s WHERE name = ?" % table_name, (name,))
, хотя это может сделать вашу программу уязвимой для атак SQL-инъекций.
– plok
13 October 2011 в 12:15