【问题标题】:iPhone Web App database SQLite and MySQLiPhone Web App 数据库 SQLite 和 MySQL
【发布时间】:2010-10-03 15:41:18
【问题描述】:

我正在为 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,我需要将所有数组放入本地数据库。

这个网站上的人似乎能够做到这一点,所以我希望你能提供帮助, 谢谢, 汤姆·勒德洛

【问题讨论】:

    标签: iphone sqlite web-applications


    【解决方案1】:

    SQLite INSERT syntax 仅支持单行插入。这应该不是问题。

    为什么?因为你应该使用参数化查询,而不是将一个巨大的字符串连接在一起,并希望你已经正确地完成了所有的“转义”,这样就不会有 SQL 注入漏洞。此外,将所有内容都添加到语句中会增加解析开销(您已经花费了所有精力来转义内容,而现在 SQLite 必须花费更多精力来取消转义内容)。

    suggested way to use a statement 是这样的:

    1. sqlite3_exec(db, "BEGIN", NULL, NULL, NULL);
    2. sqlite3_prepare_v2(db, "INSERT INTO planner (title,duedate,submitdate,subject,info) 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);

    我已将插入封装在事务中以提高性能(在事务之外,所有 INSERT 都发生自己的事务,我发现这要慢得多...)。

    对于 sqlite 的 Objective-C 包装器,您可以尝试 FMDB(它有一个相当不错的 sqlite3_bind_*() 包装器,但它在可能使用 SQLITE_TRANSIENT 或保留/复制其参数时使用 SQLITE_STATIC)。

    【讨论】:

    • 嗨,对不起,我可能没有提到,但我正在写这个作为一个网络应用程序。我不确定这些事情是否可以在不学习 Objective C 的情况下完成。我这样调用函数:transaction.executeSql("string",[], handler, handler)。不确定这是否有帮助。
    • transaction.executeSql() 似乎支持与 executeSql("INSERT INTO foo (bar,baz) VALUES (?,?)", [bar, baz], ...) 之类的参数绑定。参见openbit.co.uk/?p=135中的“插入”
    【解决方案2】:

    您是否尝试过拆分插入以便一次只插入一行? 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")');
    });
    

    /莫根斯

    【讨论】:

    • 嗨,非常感谢,我很确定我已经尝试过了,但我显然没有,它完全有效。谢谢你们...
    猜你喜欢
    • 2011-03-26
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    相关资源
    最近更新 更多