【问题标题】:sqlite3 update row syntaxsqlite3 更新行语法
【发布时间】:2010-08-13 07:40:34
【问题描述】:

从 sqlite3 文档看来,我应该能够使用以下语法来更新我 iPhone 上数据库中的一行:


NSString *dbFile  = [[NSBundle mainBundle] pathForResource:@"database" ofType:@"db"];
sqlite3 *database  = NULL;

if (sqlite3_open([dbFile UTF8String], &database) == SQLITE_OK) {
 NSString *sql = [NSString stringWithFormat:@"update mytable set myfirstcolumn=%d, mysecondcolumn=%d where id=%d", int1, int2, int3];
 sqlite3_exec(database, [sql UTF8String], MyCallback, nil, nil);
}

sqlite3_close(database);

但它不会更新数据库,甚至不会调用回调方法。这只是错误的语法,例如 sqlite3_exec() 无法执行更新?

在我的示例中,所有列名都是正确的,并且三个 int 值记录为正确的值,所以我有点没有想法......

谢谢。

【问题讨论】:

    标签: iphone syntax sqlite


    【解决方案1】:

    啊,对了,现在想出了可以回答别人查询的流程。基本上,我在资源包中有数据库,其中包含一些用于我的测试的基本数据,我可以很好地阅读这些数据。但由于捆绑资源是只读的,我无法将数据写回数据库。

    因此,解决方案是在应用程序启动时以编程方式将数据库复制到应用程序的 Documents 文件夹中,但使用代码查看数据库是否已存在于那里(以免覆盖它)。因为这个文件夹是可读写的,所以更新数据库应该没有问题。

    【讨论】:

      【解决方案2】:

      sqlite3_exec 通常返回一个错误代码(int),最后一个参数可以是一个指向将设置错误消息的字符串的指针。那些说什么?

      sqlite3_exec(database, [sql UTF8String], MyCallback, nil, &errorMsg);
      

      【讨论】:

      • 嗨,我刚刚检查了错误代码,它返回 8 (SQLITE3_READONLY),这是我现在探索的起点。我没有意识到捆绑中的文件是只读的。知道将数据库文件放在读写区域的位置和方式吗?
      • 我还应该有一个数据库实例,比如在应用程序委托中,所有其他类都可以访问吗?在来自不同类的原始消息中使用上述代码访问数据库将继续创建原始数据库的新实例并覆盖任何新更改,对吗?
      • @Iain Hemstock - 您不需要拥有单个数据库实例,但这样做可能很有意义。通常,每个线程都有一个数据库实例。数据库更改将在您的应用程序中的所有数据库实例对象之间共享。这就是 SQLite 的设计方式。
      • 我还不是 iPhone 专家(还没有!),所以我的知识在这里有限。我可以告诉您,您最好使用单个实例,即使多次访问它不会创建多个实例。您是否尝试过使用 CoreData?
      • @sheepsimulator - 啊,很高兴知道。还没有遇到问题,只是希望先发制人! @MPelletier - 因为这是我完成的第一个 iPhone 项目,所以我通过使用 sqlite3 来保持事情相对简单(之前使用过 MySQL,过渡会很简单)所以在这个项目中避免使用 CoreData。我刚刚读到数据库可以进入 Documents 文件夹,而不是通过捆绑包访问,我即将对此进行探索。感谢所有的帮助。
      猜你喜欢
      • 2015-07-01
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 2016-02-28
      • 1970-01-01
      • 1970-01-01
      • 2021-11-03
      • 2010-09-21
      相关资源
      最近更新 更多