2010-10-03 2 views
0

Я создаю приложение-планировщик для iphone, который может работать в Интернете для хранения задач на сервере mysql. Однако, когда я пытаюсь синхронизировать две базы данных, у меня есть проблема. Дело, кажется, что я не могу вставить более одного набора значений сразу в базу данных iPhone:База данных iPhone Web App SQLite и MySQL

INSERT INTO planner (title, duedate, submitdate, subject, info) VALUES ('Poster', '21092010', '28092010', 'chemistry', 'elements poster'), ('Essay', '22092010', '25092010', 'english', 'essay on shakespeare') 

Это не работает. Нет ошибки или что-то в этом роде, она просто ничего не делает, она иногда помещает первую, но не другую. Возможно, я собираюсь сделать это неправильно, поэтому давайте ситуацию: У меня есть массив со списком этих свойств, назовите их 1, 2, 3, 4 и 5, мне нужен весь массив, помещенный в локальный база данных.

Люди на этом сайте, кажется, чтобы быть в состоянии сделать это, так что я надеюсь, что вы можете помочь, Спасибо, Том Ладлоу

+0

пост больше кода. – coneybeare

ответ

0

В SQLite INSERT syntax только поддерживает однорядные вставки. Это не должно быть проблемой.

Почему? Поскольку вы должны использовать параметризованные запросы, а не объединять гигантскую строку вместе и надеяться, что вы выполнили все «экранирование» должным образом, чтобы не было уязвимостей SQL-инъекций. Кроме того, приклеивание всего в утверждение увеличивает разбор служебных данных (вы потратили все эти усилия, избегая вещей, и теперь SQLite должен потратить больше усилий, чтобы избежать действий).

suggested way to use a statement что-то вроде этого:??

  1. sqlite3_exec(db, "BEGIN", NULL, NULL, NULL);
  2. sqlite3_prepare_v2 (дб, «INSERT INTO планировщик (название, DueDate, submitdate, предмет, данные) VALUES (,,,, ?)
  3. для каждой строки необходимо вставить,
    1. sqlite3_bind() пяти параметров (которые на основе 1 связанные параметры, так что 1, 2, 3, 4, 5).
    2. sqlite3 _step(). Он должен возвращать SQLITE_DONE.
    3. sqlite3_reset() (так что вы можете использовать оператор) и sqlite3_clear_bindings() (для ровного)
  4. sqlite3_finalize(), чтобы уничтожить заявление.
  5. sqlite3_exec(db, "COMMIT", NULL, NULL, NULL);

Я завернула вставки в транзакции для повышения производительности (за пределами сделки, все Вставки случаются свои собственные сделки, которые я нашел, чтобы быть значительно медленнее ...).

Для обертки Objective-C вокруг SQLite, вы можете попробовать FMDB (он имеет достаточно хорошую обертку вокруг sqlite3_bind _ *(), за исключением того, что использует SQLITE_STATIC, когда он, вероятно, следует использовать SQLITE_TRANSIENT или удерживающее/копирования его аргументы).

+0

Привет, извините, я, возможно, не упомянул, но я пишу это как веб-приложение. Я не уверен, что это можно сделать без изучения Objective C. Я вызываю функцию следующим образом: transaction.executeSql («string», [], обработчик, обработчик). Не уверен, что это поможет. –

+0

transaction.executeSql(), похоже, поддерживает привязку параметров к чему-то вроде 'executeSql (« INSERT INTO foo (bar, baz) VALUES (?,?) », [Bar, baz], ...)'. См. «Вставка» в http://openbit.co.uk/?p=135 –

0

Вы пытались разделить свои вставки, чтобы вы вставляли только одну строку за раз? tc намекает на это в своем ответе, хотя и использует собственный код.

Попробуйте посмотреть на этот пример с двумя вставками:

/* Substitute with your openDatabase call */ 
var db = openDatabase('yourdb', '1.0', 'Planner DB', 2 * 1024 * 1024); 
db.transaction(function (tx) { 
    tx.executeSql('INSERT INTO planner (title, duedate, submitdate, subject, info) VALUES ("Poster", "21092010", "28092010", "chemistry", "elements poster")'); 
    tx.executeSql('INSERT INTO planner (title, duedate, submitdate, subject, info) VALUES ("Essay", "22092010", "25092010", "english", "essay on shakespeare")'); 
}); 

/Могенс

+0

Привет, спасибо, я был так уверен, что я пробовал это, но я, очевидно, этого не делал, Он работал полностью. Благодаря вам и ... –