База данных iPhone Web App SQLite и MySQL - PullRequest
0 голосов
/ 03 октября 2010

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

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, мне нужно весь массив положить в локальную базу данных.

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

Ответы [ 2 ]

0 голосов
/ 05 октября 2010

Вы пытались разделить вставки, чтобы вы вставляли только одну строку за раз? 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 голосов
/ 04 октября 2010

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

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

Предлагаемый способ использования оператора выглядит примерно так:

  1. sqlite3_exec(db, "BEGIN", NULL, NULL, NULL);
  2. sqlite3_prepare_v2 (db, "INSERT INTO planner (title, duedate, submitdate, subject, info) ЗНАЧЕНИЯ (?,?,?,?,?)
  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);

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...