【问题标题】:iOS SQLite: Insert statement fails, can't see whyiOS SQLite:插入语句失败,看不到原因
【发布时间】:2012-07-30 11:57:23
【问题描述】:

所以我可以使用以下语句为第一个表创建没有问题的数据库:

     const char *sqlStatement = "CREATE TABLE IF NOT EXISTS LIBRARY_SEARCH (SEARCH_ID INTEGER PRIMARY KEY AUTOINCREMENT, SEARCH_TERM TEXT)";

但是当我去插入一行时它失败了。这就是我插入行的方式。

NSString *insertStatement = [NSString stringWithFormat:@"INSERT INTO LIBRARY_SEARCH(SEARCH_TERM) VALUES (\"%@\")", myQuery] ;

其中 myQuery 是一个 NSString,用于保存应用程序中 searchBar.text 的值。它是一个属性,当然是合成的。

所以我然后称之为:

     if ( sqlite3_exec(searchSessionDB, [insertStatement UTF8String], NULL, NULL, &insert_error) == SQLITE_OK)

失败了。有谁知道为什么?

【问题讨论】:

  • NSLog(@"%s", sqlite3_errmsg(searchSessionDB)); 说什么?
  • 它说“内存不足”。
  • 想我可能会拥有它。谷歌搜索了这个错误,我想我在我的开放数据库语句中打错了。会检查的。
  • 是的,就是这样。谢谢罗伯特。

标签: ios sqlite insert


【解决方案1】:

知道了。在我的开放数据库语句中犯了一个小错误。

对于将来看到这个的人来说,这就是开场白现在的样子(而且效果很好!):

if(sqlite3_open(dbpath, &searchSessionDB) = SQLITE_OK){

感谢 Robert Ryan 推荐这个 NSLog:

NSLog(@"%s", sqlite3_errmsg(searchSessionDB));

感谢 Elpsk 和 H2CO3 提供包装器/应用程序包信息。

【讨论】:

  • 两件事:首先,如果您希望 sqlite 在找不到数据库的情况下创建数据库,那么您的语法就可以了。但是如果你想让它在找不到数据库的情况下报错,最好使用sqlite3_open_v2(dbpath, &searchSessionDB, SQLITE_OPEN_READWRITE, NULL)(假设dbpath是一个“const char *”)。如果找不到,标准 sqlite3_open 将创建一个数据库。这不会。
  • 第二,这听起来很奇怪,但请确保您“接受”自己的答案,这样这个问题就会从未回答的问题列表中删除。
  • 啊,关于 sqlite3_open_v2 的好建议。是的,我打算接受它,但它不会让我两天。再次感谢。
  • 哦,我不知道你不能接受你自己的答案两天,但我可以想象为什么。谢谢你告诉我!
【解决方案2】:

我建议您使用FMDB 来查询您的数据库。

它是 sqlite 的包装器,易于使用且简单易用,所有错误都得到了更好的解释

【讨论】:

    【解决方案3】:

    我确定您正在尝试更新位于您的应用程序包中的 SQLite 数据库。你不能:你不能写入你的应用程序自己的包。将数据库文件复制到应用沙箱之外的 Documents 或 Library 目录中。

    其他:如果您正在寻找 OO SQLite 包装器,请查看 mine

    【讨论】:

    • 优秀的答案。不过,在不冒犯您的 OO 包装器的情况下,我必须同意 elpsk 的建议以使用 FMDB。优秀的包装。
    • @RobertRyan 没问题 :) 它们满足不同的需求。我的包装器用于快速、方便、简单的手动数据库访问,而不是“企业”。 :)
    • 感谢您的推荐。现在是一个愚蠢的错字导致了这个问题,但我会调查 App bundle 问题。
    猜你喜欢
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    相关资源
    最近更新 更多