2010-10-03 7 views
0

Je fais une application planificateur pour l'iphone qui peut fonctionner en ligne pour stocker des tâches dans un serveur mysql. Cependant, lorsque je tente de synchroniser les deux bases de données, j'ai un problème. La chose semble être que je ne peux pas insérer plus d'un ensemble de valeurs à la fois dans la base de données iPhone:Base de données iPhone Web App SQLite et MySQL

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

Cela ne fonctionne pas. Il n'y a pas d'erreur ou quoi que ce soit de pareil, ça ne fait rien, ça met parfois le premier dedans, mais pas l'autre. Peut-être que je vais à ce sujet dans le mauvais sens, donc pour donner la situation: J'ai un tableau avec une liste de ces propriétés, appelez-les 1, 2, 3, 4 et 5, j'ai besoin de tout le tableau mettre dans le local base de données.

Les gens sur ce site semblent être en mesure de le faire alors j'espère que vous pouvez aider, Merci, Tom Ludlow

+0

code postal plus. – coneybeare

Répondre

0

Les SQLite INSERT syntax ne supporte que des inserts Les mono-ligne. Ca ne devrait pas être un problème.

Pourquoi? Parce que vous devriez utiliser des requêtes paramétrées, ne pas concaténer une chaîne géante ensemble et espérer que vous avez fait tous les "échappements" correctement afin qu'il n'y ait pas de vulnérabilités d'injection SQL. De plus, coller tout dans l'instruction augmente les frais généraux d'analyse (vous avez dépensé tous ces efforts pour échapper aux choses, et maintenant SQLite doit dépenser plus d'efforts pour ne pas échapper aux choses).

Le suggested way to use a statement est quelque chose comme ça:??

  1. sqlite3_exec(db, "BEGIN", NULL, NULL, NULL);
  2. sqlite3_prepare_v2 (db, « INSERT INTO planificateur (titre, DueDate, submitdate, sujet, info) VALUES (,,,, ?)
  3. pour chaque ligne que vous souhaitez insérer,
    1. sqlite3_bind() les cinq paramètres (paramètres liés sont basés 1, donc 1, 2, 3, 4, 5).
    2. sqlite3 _étape(). Il devrait retourner SQLITE_DONE.
    3. sqlite3_reset() (vous pouvez donc réutiliser la déclaration) et sqlite3_clear_bindings() (pour faire bonne mesure)
  4. sqlite3_finalize() pour détruire la déclaration.
  5. sqlite3_exec(db, "COMMIT", NULL, NULL, NULL);

J'ai enveloppé les inserts dans une transaction pour augmenter les performances (en dehors d'une transaction, tous les INSERTs se produisent leur propre transaction, que j'ai trouvé significativement plus lent ...).

Pour une enveloppe Objective-C autour sqlite, vous pouvez essayer FMDB (il a une enveloppe assez agréable autour sqlite3_bind _ *(), sauf qu'il utilise SQLITE_STATIC quand il devrait probablement utiliser SQLITE_TRANSIENT ou conserver/copier ses arguments).

+0

Salut, désolé je n'ai peut-être pas mentionné, mais je suis en train d'écrire comme une application web. Je ne suis pas sûr si ces choses peuvent être faites sans apprendre l'objectif C. J'appelle la fonction comme ceci: transaction.executeSql ("chaîne", [], handler, handler). Je ne sais pas si cela aide. –

+0

transaction.executeSql() semble prendre en charge la liaison de paramètres avec quelque chose comme 'executeSql (" INSERT INTO toto (bar, baz) VALUES (?,?) ", [Bar, baz], ...)'. Voir "Insertion" dans http://openbit.co.uk/?p=135 –

0

Avez-vous essayé de séparer vos insertions pour insérer une seule ligne à la fois? Tc fait allusion à cela dans sa réponse, mais en utilisant du code natif.

Essayez de regarder cet exemple avec deux inserts:

/* 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")'); 
}); 

/Mogens

+0

Salut, Merci beaucoup, j'étais tellement sûr que j'avais essayé cela mais je ne l'avais évidemment pas, ça a fonctionné complètement. Merci à vous deux ... –

Questions connexes